变量在线程中更新,但更新的值不会反映在循环内

时间:2017-07-31 06:35:05

标签: python multithreading

我在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.')

我的版本不起作用。它只是循环而上。为什么一个简单的布尔标志在这里不起作用?谢谢。

1 个答案:

答案 0 :(得分:1)

mutex是一个循环变量。它在i th 迭代中接收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)