[英]How to make sure shared variables are thread-safe?
我面臨類似的問題:
DemoVar = 100 #### or whatever
def DemoMultiThreadMethod(mode):
DemoRLock.acquire()
DemoVar = 0 #### or random value
...
Other resources which do not support multi-threaded access
if mode == 0:
do A with DemoVar
elif mode == 1:
do B with DemoVar
...
DemoRLock.release()
...
def DecideAfterDemo(self):
NewThread = threading.Thread(target = DemoMultiThreadMethod, args = (RandomMode, ))
NewThread.start()
NewThread.join()
Result = DemoVar
if Result == SpecificValue:
Do something
else:
Do another
...
...
def SpawnThreads(self):
#### hundreds of DecideAfterDemo running
Counter = 0
while Counter < 1000:
SpawnAThread = threading.Thread(target = DecideAfterDemo, args = ())
SpawnAThread.Start()
...
如何確定運行Result = DemoVar
是安全的?
我的意思是,如果有大量等待處理的鎖定DemoMultiThreadMethod
,則您實際上並不知道DemoVar = 0 #### or random value
和Result = DemoVar
一個首先運行,因為它們都是原子操作(如果我錯了,請糾正我),這意味着如果池中有太多線程,則Result = DemoVar
可能不安全。 我能想到的解決方案是在DemoRLock.acquire()
time.sleep(0.01)
之后添加DemoRLock.acquire()
time.sleep(0.01)
以確保Result = DemoVar
首先運行,但這會損失一些生產力。 有更好的主意嗎?
您要從DemoMultiThreadMethod發送一些值(DemoVar)到DecideAfterDemo。 雖然您可以使用一些消息傳遞庫,但是最簡單的方法是定義線程類...類似(未經測試):
class DemoMultiThread(threading.Thread):
def __init__(self, mode):
self.mode = mode
threading.Thread.__init__(self)
def run(run):
mode = self.mode
DemoRLock.acquire()
...
self.result = DemoVar
DemoRLock.release()
def DecideAfterDemo(self):
NewThread = DemoMultiThread(mode)
NewThread.start()
NewThread.join()
Result = NewThread.result
....
現在,每次我嘗試與多個線程交換/共享信息時,我都會立即轉到Queue
模塊,這更加方便。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.