我有两个同一个类的实例,其中一个Lock变量是全局声明的。
这个类有一个.run()方法,它创建一个Thread,它将从同一个类运行另一个方法(这两个方法在问题的最后)
我的代码中有如下测试打印语句如下:
[main.py]
first = className()
second = className()
print('test before first')
first.run()
print('test before second')
second.run()
我的输出是:
[输出]
test before first
first Thread lock acquired by first
first Thread lock released (will sleep now)
first Thread lock acquired by first
first Thread lock released (will sleep now)
并且它永远不会到达这一行,它应该启动另一个使用互斥锁'threading.Lock()'竞争资源的线程:
[main.py]
print('test before second')
运行的类方法:
[className.py]
def run(self):
tr = threading.Thread(target= self.update())
tr.start()
return True
def update(self):
while(True):
try:
global lock
lock.acquire()
print('first Thread lock acquired by ' + self.name)
#do stuff
lock.release()
print('lock release')
sleep(2)
except:
sleep(5)
答案 0 :(得分:0)
在run方法的第二行中,目标值应该是没有括号的方法名称。
def run(self):
tr = threading.Thread(target= self.update)
# Instead of:
tr = threading.Thread(target= self.update())
tr.start()
不同之处在于,在原始版本中,tr变量将等待方法的结果,并且永远不会完成。 在正确的一个中,tr将开始运行,程序将继续运行。