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