Многопоточность на Python

#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
  

Этот код выполняет итерацию по выходным мьютексам и для каждого мьютекса входит в цикл, ожидающий блокировки мьютекса.

Однако он использует «активное ожидание», что приводит к очень высокой загрузке процессора (например, бесконечный цикл бездействия), что очень плохо.