2011-08-27 31 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