2011-08-27 26 views
2

我遇到了线程意外的行为。我已经把它贴在下面简短的例子来演示行为:类变量和线程 - 意外的行为

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

回答

3

您没有使用“线程锁定”,您正在使用进程锁定。由于进程不共享堆内容,每次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() 
+0

谢谢,这作品!事后看来,我的问题的答案相当简单,但对于这些简单的更改却有很大的复杂性。我将花更多时间看看线程和多处理之间的差异。感谢您提供快速,准确和有用的答案。 – Chris