Совместное использование многопроцессорного примитива синхронизации между процессами
(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
). Тем не менее, даже если это работает, я не знаю, как обеспечить только один процесс на самом делеput
s (7 копий) примитивов синхронизации в очередь, в то время как ее толькоget
их. (Конечно, я могу создать еще один примитив синхронизации в родительском процессе просто для этого, но тогда я мог бы также реорганизовать свой код для создания оригинальногоBarrier
в родительском процессе в конце концов.)