Совместное использование многопроцессорного примитива синхронизации между процессами

(Python 3.4, Linux).

У меня есть основной процесс «P», который разветвляется на 8 процессов (от «C1» до «C8»). Я хочу создатьmultiprocessing.Barrier это гарантирует, что все 8 дочерних процессов синхронизируются в определенный момент.

Все работает нормально, если я определяю примитив синхронизации в родительском процессе, поэтому, когда я разветвляю дочерние процессы, он должным образом наследуется:

import multiprocessing as mp
barrier = mp.Barrier(8)

def f():
  # do something
  barrier.wait()
  # do more stuff

def main():
  for i in range(8):
    p = mp.Process(target = f)
    p.start()

if __name__ == '__main__':
  main()

Но в моем случае я не знаю деталей, необходимых для созданияBarrier объект до тех пор, пока не начнутся дочерние процессы (я не знаю аргумент, который я хочу передать как егоaction параметр). Поэтому я хочу создатьBarrier в одном из дочерних процессов, но я не знаю, как сделать его доступным для других дочерних процессов. Следующее не будет работать, конечно, потому что 8Barrier объекты в дочернем процессе полностью независимы друг от друга:

import multiprocessing as mp

def f():
  global barrier
  # do something
  barrier = mp.Barrier(8)
  barrier.wait()
  # do more stuff

def main():
  for i in range(8):
    p = mp.Process(target = f)
    p.start()

if __name__ == '__main__':
  main()

Я думал создатьbarrier в одном из дочерних процессов и передать его другим, используяmultiprocessing.Queue (или еслиQueue не принимаетBarrier объекты, используяmultiprocessing.Manager().Barrier). Тем не менее, даже если это работает, я не знаю, как обеспечить только один процесс на самом делеputs (7 копий) примитивов синхронизации в очередь, в то время как ее толькоget их. (Конечно, я могу создать еще один примитив синхронизации в родительском процессе просто для этого, но тогда я мог бы также реорганизовать свой код для создания оригинальногоBarrier в родительском процессе в конце концов.)

Ответы на вопрос(0)

Ваш ответ на вопрос