簡體   English   中英

變量在線程中更新,但更新后的值不反映在循環內

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM