Python Glossary English

все 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Сообщить о неточности