2017-07-31 67 views
0

我被馬克·魯茨學習編程的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.') 

我的版本不起作用。它只是循環而過。爲什麼簡單的布爾標誌在這裏不起作用?謝謝。

+0

'而不是mutex'不重讀列表條目。 – user2357112

回答

1

mutex是一個循環變量。它接收到exitmutexes[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)