Python Glossary English

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