我正在用Python的Queue.Queue
類實現一個相對簡單的線程池。我有一個生產者類,其中包含Queue
實例以及一些便利方法,以及threading.Thread
的子類。我基於一個整數爲我的池中的每個線程實例化該對象(「工作線程」,我認爲它們被調用)。我是否應該將線程本地存儲用於只存在於{class,method}中的變量?
每個工作線程將flag, data
從隊列中取出,使用自己的數據庫連接對其進行處理,並將該行的GUID放置到列表中,以便生產者類知道作業何時完成。
雖然我知道,其他模塊實現我編碼的功能,我編碼這樣做的原因是爲了更好地瞭解Python如何線程的作品。這使我想到了我的問題。
如果我存儲在一個函數的命名空間或在類的__dict__
對象什麼,會不會是線程安全的?
class Consumer(threading.Thread):
def __init__(self, producer, db_filename):
self.producer = producer
self.conn = sqlite3.connect(db_filename) # Is this var thread safe?
def run(self):
flag, data = self.producer.queue.get()
while flag != 'stop':
# Do stuff with data; Is `data` thread safe?
我想這兩個將是線程安全的,這是我的理由:
- 每次一個類實例化時,一個新的
__dict__
被創建。在我上面概述的場景下,我認爲任何其他對象都不會引用此對象。 (現在,或許情況會如果我用join()
的功能變得更加複雜,但我不...) - 每當一個函數被調用,它會創建自己的名字空間,存在功能的壽命。我沒有做任何變量
global
,所以我不明白任何其他對象如何引用一個函數變量。
This post有點我的問題,但對我來說仍然有點抽象。
在此先感謝您爲我解決這個問題。