все Python 3threadingпонятие
threading.Semaphore
синхронизация
Семафор ограничивает количество потоков, одновременно выполняющих блок кода. Полезен для ограничения параллельных запросов.
Синтаксис
sem = threading.Semaphore(n)
with sem: ...
Обычный Semaphore не следит за балансом: лишний release() тихо поднимает лимит выше стартового n, и баг с утечкой разрешений маскируется — для его отлова берите BoundedSemaphore, он вместо этого бросит ValueError. Semaphore(1) похож на Lock, но освобождать его может любой поток, тогда как Lock рассчитан на парные acquire/release в одном месте.
Примеры
import threading
sem = threading.Semaphore(3) # не более 3 одновременно
import threading
import time
sem = threading.Semaphore(3)
def task(i):
with sem:
print(f'выполняю {i}')
time.sleep(0.1)
threads = [threading.Thread(target=task, args=(i,)) for i in range(10)]
for t in threads: t.start()
for t in threads: t.join()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности