все Python 3multiprocessingпонятие
multiprocessing.Semaphore
синхронизация
Семафор между процессами: счётчик разрешений, который ограничивает, сколько процессов одновременно делают что-то одно.
Синтаксис
sem = ctx.Semaphore(value=1); sem.acquire(block=True, timeout=None); sem.release()
Обычный Semaphore не проверяет лишние release(): счётчик растёт выше начального, и ограничение тихо ослабевает — для защиты от этой ошибки есть BoundedSemaphore. Аргумент acquire() называется block, а не blocking, как в threading: acquire(blocking=False) даёт TypeError. get_value() на macOS бросает NotImplementedError. Примитив передают ребёнку аргументом Process при создании; через Queue или аргументы Pool его не передать — RuntimeError «should only be shared between processes through inheritance».
Примеры
import multiprocessing as mp
if __name__ == '__main__':
sem = mp.get_context('spawn').Semaphore(1)
print(sem.acquire(timeout=0.1), sem.acquire(timeout=0.1)) # → True False
sem.release()
sem.release() # лишний release ошибки не даёт
print([sem.acquire(False) for _ in range(3)]) # → [True, True, False]
try:
sem.acquire(blocking=False)
except TypeError:
print('use block=, not blocking=') # → use block=, not blocking=
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности