2011-07-07 88 views
0

我有一個Python接口類到一個大的C++庫,它爲我做了一些工作(具有大量的數據)。我可以通過發送一個信號,即os.kill(pid,signal.SIGINT),優雅地阻止工作人員。 所以,我想我應該能夠運行在p = Process(target=worker.run())工人 - 這工作 - 這工作在良好 - - 然後在任意時間通過發送一個信號中斷工作者,但:工人的python多處理狀態

我不能讓國家的工人回來!有幾個函數被導出,它應該給我關於工作人員正在做什麼的信息,但是(顯然在調用p.join()後),所有這些函數都返回,就是初始值。爲什麼? (工人實際上做了他的工作,我可以在創建的輸出文件中看到這些信息,但我沒有在那裏獲得信息,在工作期間我想要...)

使用隊列或多處理器管理器似乎不是一種選擇,因爲對象並不是真正的「可選」,如果我只需要工作器中特定變量的狀態,我也不想複製所有內容。 (我不敢肯定我對這個可鄙概念有着堅定的把握......)

在此先感謝您的任何建議!

+0

正如aix的答案所暗示的,這聽起來像是您將多處理與線程行爲混爲一談。子進程需要以某種方式將狀態傳回父進程。如果你想要傳遞回來的狀態是一個基本的數據類型,那麼只要pickleability變好就不用擔心(http://docs.python.org/library/pickle.html) –

回答

1

multiprocessing中,工作人員作爲單獨的進程運行。每個進程都有自己的地址(內存)空間。

這意味着如果工作人員更改變量,除非you've taken steps to make it visible,否則更改對父級不可見。

+0

是的,謝謝,我想我終於明白了。出於某種原因,我認爲再次「連接」兩個進程會奇蹟般地從連接的地址空間中檢索對象。 ;-)事實上,我發現名字'加入'不幸,因爲沒有真正加入,父母似乎只是等待孩子的終止。 – FrustratedProcessKiller