我遇到了线程的意外行为。我在下面附加了一个简短的示例来演示该行为:
from multiprocessing import Process, Lock
import time
class inc:
def __init__(self):
print "Initializing a new class"
self.value = 0
def add_one(self):
self.value += 1
print self.value
def f(a,l):
# Do something using a class call
l.acquire()
a.add_one()
l.release()
#Do something that takes a long time
time.sleep(5)
#Do a different thing using a class call
l.acquire()
a.add_one()
l.release()
if __name__=="__main__":
a=inc()
lock = Lock()
for i in range(0,4):
Process(target=f, args=(a,lock)).start()
我正在寻找的输出是 1,2,3,4,5,6,7,8 但我得到:1,1,1,1,2,2,2,2。我是否正确使用了线程锁固?该类只存在一个实例,并且我序列化了对该类的线程访问,那么为什么类变量不增加呢?
最佳答案
您没有使用“线程锁定”,您正在使用进程锁定。由于进程不共享堆内容,因此每次 f
都会获取不同的对象。
参见threading
- 用于线程操作的 Python 库。它允许您实现所需的行为。
可能只是替换
from multiprocessing import Process, Lock
...
Process(target=f, args=(a,lock)).start()
与
from threading import Thread, Lock
...
Thread(target=f, args=(a,lock)).start()
关于python - 类变量和线程 - 意外的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213051/