[英]Variable is updated in a thread but updated value does not reflect inside a loop
我正在研究Mark Lutz的《 Python編程》中的多線程,並遇到以下示例:
import _thread as thread
stdoutmutex = thread.allocate_lock()
exitmutexes = [thread.allocate_lock() for i in range(5)]
def counter(myId, count):
for i in range(count):
stdoutmutex.acquire()
print('[%s] => %s' % (myId, i))
stdoutmutex.release()
exitmutexes[myId].acquire()
for i in range(5):
thread.start_new_thread(counter, (i, 20))
for mutex in exitmutexes:
while not mutex.locked(): pass
print('Main thread exiting.')
上面的代碼工作正常。 它為每個子線程使用互斥鎖,並將它們添加到全局exitmutexes
列表中。 在退出時,每個線程都通過打開其鎖來向主線程發出信號。
我以為我可以使用一般的布爾標志,而不是allocate_lock()
。 所以我將上面的代碼修改為:
import _thread as thread
stdoutmutex = thread.allocate_lock()
exitmutexes = [False for i in range(5)]
def counter(myId, count):
for i in range(count):
stdoutmutex.acquire()
print('[%s] => %s' % (myId, i))
stdoutmutex.release()
exitmutexes[myId] = True
for i in range(5):
thread.start_new_thread(counter, (i, 20))
for mutex in exitmutexes:
while not mutex: print(exitmutexes)
print('Main thread exiting.')
我的版本不起作用。 它只是不斷循環。 為什么簡單的布爾標志在這里不起作用? 謝謝。
mutex
是一個循環變量。 它接收到的值的快照exitmutexes[i]
在第i 次迭代,從而當exitmutexes[i]
被更新時,變化不可見mutex
。 所以,
while not mutex
即使更新了該條目也將不斷測試該條目的舊值。 您應該改為遍歷索引:
for i in range(len(exitmutexes)):
while not exitmutexes[i]: print(exitmutexes[i])
另外,用enumerate
:
for i, mutex in enumerate(exitmutexes):
while not exitmutexes[i]: print(mutex)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.