我面临类似的问题:
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)
以确保 Result = DemoVar
先运行,但这会失去一些 生产环境 力 . 有什么好主意吗?
2 回答
你想要的是从DemoMultiThreadMethod发送一些值(DemoVar)到DecideAfterDemo . 虽然你可以使用一些消息传递库,但最简单的方法是定义线程类......像这样(未经测试):
现在,每当我尝试与多个线程交换/共享信息时,我会立即转到
Queue
模块,这样更方便 .