Python Glossary English

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