问下这段代码错误在哪里?

问下这段代码错误在哪里?

import threading
import time


balance = 100

lock = threading.Lock()
lock2 = threading.Lock()

def add(n):
   lock2.acquire()
   try:
       global balance
       balance += n
       print(balance)
   finally:
       lock2.release()
       #print(balance)
       return balance


def mins(n):
   lock.acquire()
   try:
       global balance
       balance -= n
   finally:
       lock.release()
       print(balance)
       return balance


'''
def change(n):
   add(n)
   mins(n)
   print('n: {}, balance:{}'.format(n,balance))

'''

class threadTest(threading.Thread):

   lock = threading.Lock()
   def __init__(self,number,*args,**kwargs):
       super().__init__(*args,**kwargs)
       self.number = number

   def run(self):
       i = 0
       for i in range(10):
           self.lock.acquire()
           try:
               n = add(self.number)
               print('add({}):   balance:{}'.format(i,n))
               i += 1
           finally:
               self.lock.release()



class threadTest2(threading.Thread):

   lock = threading.Lock()

   def __init__(self,number,*args,**kwargs):
       super().__init__(*args,**kwargs)
       self.number = number


   def run(self):
       i = 0
       for i in range(10):
           self.lock.acquire()
           try:
               n = mins(self.number)
               print('mins({}):  balance:{}'.format(i,n))
               i += 1
           finally:
               self.lock.release()






if __name__ == '__main__':

   t = threadTest(1)
   t3 = threadTest2(5)
   t1 = threadTest(5)
   t2 = threadTest2(1)

   t.start()
   t1.start()
   t2.start()
   t3.start()

'''
   i = 0
   while i < 10:
        add(10)
        mins(10)
        i += 1
'''

老师问下这段代码的错误在哪里。。我不是已经锁住了么,每次运行到最后打印出来的结果也是balance不变,但是程序内储存的结果balance每次都会变化,这是为什么呢? 

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕美 2020-06-20 19:05:42

同学,你好。运行同学的代码没有出现该问题的,同学可以在文件中右击,选择run重新运行文件。

http://img1.sycdn.imooc.com//climg/5eeded16097be9b507710266.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 慕前端8369922 #1
    balance = 100 def add(n,name): global balance balance = balance + n print('name: ' + name + ' is doing add, balance is ' + str(balance)) return balance class threadTest(threading.Thread): def __init__(self,number,name,*args,**kwargs): super().__init__(name = name,*args,**kwargs) self.number = number def run(self): i = 0 for i in range(10): name = threading.current_thread().name n = add(self.number,name) print('{} add {} ({}): balance:{}'.format(name,self.number,i,n)) i += 1 if __name__ == '__main__': t = threadTest(1, 't') t.start() 你好,我现在把代码删除到这个地步还是有问题,每次只要开始跑 balance的值在某个地方就会停住不变,并且就算我在控制台手动调用add 函数,也没法改变。 这个应该就是问题所在了,问下这个是啥原因呢?
    2020-06-21 02:23:53
  • 提问者 慕前端8369922 #2
    这里不能传图片,就好像这段代码我跑完 最后打印出来的是: name: t is doing add, balance is 110 t add 1 (9): balance:110 然后我输入 balance 结果 102 然后我调用 add(10,'add') 结果 name: add is doing add, balance is 120 120 明明输入balance 的值是102? 但我调用add 给它加10 为啥balance就变成120了? 最后输入 balance 结果 102 问下是什么导致的呢
    2020-06-21 02:28:01
  • 好帮手慕笑蓉 回复 提问者 慕前端8369922 #3
    同学,你好。同学是否打了断点进行调试,如果打了断点,则balance的值会在某个地方就会停住不变,只有按下f8程序才会继续往下跑。如果该回答不是同学要表达的意思,请同学详细描述开始跑 balance的值在某个地方就会停住不变的问题,会有老师为你解决问题的。 祝学习愉快~
    2020-06-21 14:05:55
好帮手慕美 2020-06-20 17:38:53

同学,你好。balance的值在执行相同次数的加操作和减操作,最终在输出该值时是和初始值是一样的,

例:

http://img1.sycdn.imooc.com//climg/5eedd82a09e7cd6202170268.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 慕前端8369922 #1
    你好,我这段代码执行下来就是结果不一样啊
    2020-06-20 17:40:57
提问者 慕前端8369922 2020-06-20 08:31:22

http://img1.sycdn.imooc.com//climg/5eed588f0901b43b23010493.jpg结果都基本类似于这样,明明左边都已经显示balance是没有变的了,为什么右边的balance一直和左边显示的不一致? 

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师