Python 多线程

2 投票
1 回答
1263 浏览
提问于 2025-04-16 15:43

大家好,我对以下代码的一部分有点搞不懂(来自Mark LutzProgramming Python):

import _thread as thread

stdoutmutex = thread.allocate_lock()
exitmutexes = [thread.allocate_lock() for i in range(10)]

def counter(myId, count):
    for i in range(count):
        stdoutmutex.acquire()
        print('[%s] => %s' % (myId, i))
        stdoutmutex.release()
    exitmutexes[myId].acquire()

# signal main thread
for i in range(10):
    thread.start_new_thread(counter, (i, 100))

for mutex in exitmutexes:
    while not mutex.locked(): pass
print('Main thread exiting.')

我在用Python3。关于stdoutmutex的东西我能理解它是怎么工作的,但我不太明白上面的代码是怎么处理exitmutexes这个列表的,因为exitmutexes里的每个锁都已经被获取了,但并没有被释放。一旦所有10个线程都启动了,下面的3行是怎么工作的呢?作者把这个描述为一种不使用time.sleep()的方法。

for mutex in exitmutexes:
        while not mutex.locked(): pass
    print('Main thread exiting.')

1 个回答

0

这个代码的主要功能是等到所有的退出互斥锁都被锁定了,然后才退出。

for mutex in exitmutexes:
    while not mutex.locked(): pass

这段代码会遍历所有的退出互斥锁,对于每一个互斥锁,它会进入一个循环,等待这个互斥锁被锁定。

不过,它使用的是“主动等待”,这会导致CPU的使用率非常高(就像是一个无休止的循环在那儿干等着),这其实是个很糟糕的做法。

撰写回答