все Python 3multiprocessingпонятие
multiprocessing.Condition
синхронизация
Условная переменная между процессами: один процесс ждёт в wait() или wait_for(), другой будит его notify() после изменения общего состояния.
Синтаксис
cond = ctx.Condition(lock=None); with cond: cond.wait_for(pred, timeout); cond.notify_all()
wait() и notify() вызываются только под захваченной блокировкой — иначе AssertionError, а не RuntimeError, как в threading. Само «условие» должно жить в общей памяти (Value, Array, Manager): обычная переменная у каждого процесса своя, и проверять ждущему будет нечего. wait_for(predicate, timeout) надёжнее голого wait(): он перепроверяет условие после ложных пробуждений и возвращает его значение. Примитив передают ребёнку аргументом Process при создании; через Queue или аргументы Pool его не передать — RuntimeError «should only be shared between processes through inheritance».
Примеры
import multiprocessing as mp
def producer(cond, ready):
with cond:
ready.value = 1
cond.notify_all()
if __name__ == '__main__':
ctx = mp.get_context('spawn')
cond, ready = ctx.Condition(), ctx.Value('i', 0, lock=False)
p = ctx.Process(target=producer, args=(cond, ready))
p.start()
with cond:
print(cond.wait_for(lambda: ready.value == 1, timeout=10)) # → True
p.join()
import multiprocessing as mp
if __name__ == '__main__':
cond = mp.get_context('spawn').Condition()
try:
cond.wait(0.1)
except AssertionError as e:
print(e) # → must acquire() condition before using wait()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности