Python 类变量和线程-意外行为

Python 类变量和线程-意外行为,python,multithreading,class,call,Python,Multithreading,Class,Call,我遇到了线程的意外行为。我在下面附上一个简短的示例来演示这种行为: 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

我遇到了线程的意外行为。我在下面附上一个简短的示例来演示这种行为:

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,2,2,2,2。我是否正确使用线程锁定?该类只有一个实例存在,我序列化了对该类的线程访问,因此为什么该类变量不递增?

您没有使用“线程锁定”,而是使用进程锁定。由于进程不共享堆内容,因此每次
f
都会得到不同的对象

有关线程的操作,请参见-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()