Python Glossary English

все Python 3multiprocessingпонятие

multiprocessing.RLock

синхронизация

Рекурсивная блокировка между процессами: тот же владелец может захватить её повторно и должен столько же раз освободить.

Синтаксис

rlock = ctx.RLock(); with rlock: ...

Владелец — пара «процесс + поток», и освободить RLock может только он: чужой release() даёт AssertionError, а не RuntimeError, как у threading.RLock. Именно RLock по умолчанию стоит внутри Value, Array и Condition, поэтому with v.get_lock() внутри другого with v.get_lock() не зависает. Примитив передают ребёнку аргументом Process при создании; через Queue или аргументы Pool его не передать — RuntimeError «should only be shared between processes through inheritance».

Примеры

import multiprocessing as mp
if __name__ == '__main__':
    rl = mp.get_context('spawn').RLock()
    with rl:
        with rl:  # повторный захват тем же владельцем
            print('nested ok')  # → nested ok
    try:
        rl.release()
    except AssertionError as e:
        print(e)  # → attempt to release recursive lock not owned by thread

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности