(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
,但我不知道如何使其可用於其他子進程。下面將當然不是工作,因爲在孩子過程中的8個Barrier
對象是完全相互獨立的:
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
)。但是,即使這樣做,我也不知道如何確保只有一個進程實際上是同步原語的(7個副本)到隊列中,而其他的將只有get
他們。 (當然,我可以在父進程中創建一個又一個同步原語來完成這個任務,但是我可能會重構我的代碼,畢竟在父進程中創建原始的Barrier
。)
*「但是,我可能會重構我的代碼,在父進程中創建原始Barrier。」*這可能是最好的選擇。試圖將父母的'Manager'傳遞給子進程將無法正常工作(當您嘗試使用它的'Proxy'對象時,您會遇到奇怪的異常)。我認爲你唯一的選擇是讓孩子告訴父母使用什麼'action',然後讓父母創建'Barrier',然後將父母的Manager()。Barrier'傳遞給孩子。但是,這需要將「mp.Queue」和「mp.Lock」傳遞給所有的孩子...... – dano 2015-04-02 22:36:33
......這很複雜。重構代碼可能更好,因此您可以在創建子項之前創建屏障。 – dano 2015-04-02 22:37:21
其實......有一種方法可以通過將孩子連接到遠程'管理器'來實現。但它仍然可能最終比它的價值更復雜。 – dano 2015-04-02 22:42:15