все Python 3multiprocessingпонятие
multiprocessing.Lock
синхронизация
Блокировка между процессами: в критической секции одновременно только один процесс или поток. Работает с with, как threading.Lock.
Синтаксис
lock = ctx.Lock(); with lock: ...
Примитив передают ребёнку аргументом Process при создании; через Queue или аргументы Pool его не передать — RuntimeError «should only be shared between processes through inheritance». Отличия от threading.Lock: освободить её может любой процесс, не только захвативший, а release() свободной блокировки даёт ValueError вместо RuntimeError. Первый аргумент acquire() называется block, а не blocking.
Примеры
import multiprocessing as mp
def add(total, lock):
for _ in range(100):
with lock:
total.value += 1
if __name__ == '__main__':
ctx = mp.get_context('spawn')
lock = ctx.Lock()
total = ctx.Value('i', 0, lock=False)
ps = [ctx.Process(target=add, args=(total, lock)) for _ in range(2)]
for p in ps:
p.start()
for p in ps:
p.join()
print(total.value) # → 200
import multiprocessing as mp
import pickle
if __name__ == '__main__':
lock = mp.get_context('spawn').Lock()
try:
lock.release()
except ValueError as e:
print(e) # → semaphore or lock released too many times
try:
pickle.dumps(lock)
except RuntimeError as e:
print(e) # → Lock objects should only be shared between processes through inheritance
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности