#python #multithreading #python-3.x
#python #многопоточность #python-3.x
Вопрос:
Всем привет, я не могу понять некоторую часть следующего кода (из Programming 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. Сохраняет ли поток работоспособным получение блокировки?
Ответ №1:
В основном он ожидает, пока все мьютексы выхода не будут заблокированы, а затем завершается.
for mutex in exitmutexes:
while not mutex.locked(): pass
Этот код выполняет итерацию по выходным мьютексам и для каждого мьютекса входит в цикл, ожидающий блокировки мьютекса.
Однако он использует «активное ожидание», что приводит к очень высокой загрузке процессора (например, бесконечный цикл бездействия), что очень плохо.