我想在python中建立一個依賴於多個線程的程序,在線程之間共享數據。我試圖避免使用全局關鍵字來做這件事,但目前爲止沒有取得任何進展。如何在共享資源時避免python線程中的全局?
作爲一個簡單的例子(下面的代碼),我的main()函數生成一個線程thread1,它應該能夠訪問變量count,在這種情況下只是爲了打印它。與此同時,main()迭代這個變量,並且thread1應該能夠看到計數改變。一些自包含的代碼在這裏:
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID):
self.threadID = threadID
threading.Thread.__init__(self)
def run(self):
global count
for i in range(10):
print "count is now: ", count, " for thread ", self.threadID, "\n"
time.sleep(5)
def main():
global count
count = 0
# spawn one or more threads
thread1 = myThread(1)
thread1.start()
for i in range(20):
time.sleep(2)
count = count + 1
# wait for thread1 to finish
thread1.join()
main()
當閱讀有關蟒蛇線程,我還沒有發現任何其他方式來做到這一點比使用全球。然而,在閱讀全球時,大多數人認爲你應該很少使用它,因爲很好的理由,有些人甚至認爲它應該完全從Python中刪除。所以我想知道是否實際上有另一種方法讓thread1「被動地」檢測到main()已經迭代計數並訪問該新值?例如。我不太瞭解python和指針(它們甚至存在於python中嗎?),但我會認爲這正是全球達到的目標。
理想情況下,我可以從main()調用一個thread1方法來設置一個新的self.count,只要count被迭代,但是因爲thread1有一個阻塞的run()方法,我看不到如何做這在thread1內部沒有另外一個獨立的線程,這看起來太複雜了。
使用'threading.Lock'來控制對全局的訪問。爲了避免全局派生一個'threading.Thread'計數器子類,它根據需要獲取和釋放它自己的私有Lock屬性,以防止兩個進程同時訪問內部計數器值。 – martineau
實際上,沒有任何理由從你的問題的'threading.Thread'派生計數器子類。它所需要的只是能夠被一個以上的線程使用,這可以通過它的Lock成員變量來完成。 – martineau
好點@martineau,只爲未來的讀者,我決定在這裏不使用鎖,主要是因爲我只是從main()更改變量,並且更改所討論的變量是一個原子操作,即thread1永遠不會讀取中途增量計數。 (雖然我不是專家,但如果我錯了,請糾正我的錯誤) – funklute