我在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.')
我的版本不起作用。它只是循环而上。为什么一个简单的布尔标志在这里不起作用?谢谢。
答案 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)