2012-10-10 67 views
1

其中,C靜態變量我已經寫在C++函數用C語言編寫的(wrapper.c)一個Python包裝蟒蛇叫,並使其可調用( foo_wrapper)。在python多進程

在wrapper.c中,我有一個靜態全局變量「x」,它由 foo使用和更新。

現在一切正常,當我在一個過程中從python呼叫 foo

但是,雖然我在Python中使用多進程模塊,但即使從主進程調用foo,此「x」值也不是它應該是的!調用過程是這樣的:

P=Process(target=myf, args=(a,)) 
P.start() 
foo_wrapper() 
P.join() 

我的問題是:當叉()被調用,即多個進程啓動,如何處理蟒父/子進程的堆棧或堆?我怎樣才能將「x」的價值賦予主流程(或父流程)?

+0

「這個‘X’的值是不是也應該如此!」 - 你能多給一點描述嗎?它有什麼問題? – mgilson

+0

x初始化一次。但是在fork之後,主進程中的x值沒有加載,即與以前不一樣。 – pilot

回答

0

C++全局變量是全球唯一一個單一的過程。如果您使用的是multiprocessing模塊,然後通過定義,你將有多個進程,每一個都有自己的全局變量的視圖。 Python沒有做任何特殊的事情來影響這種行爲。

假設你有C++代碼的控制,我建議重構它做的一種形式,Python可以序列化和deserialise到Python可見這個全局狀態。然後您可以在需要的進程之間傳遞狀態(例如,使用multiprocessing之一的隊列類)。

+0

酷!但你能解釋一下,爲什麼叉後,全局變量這是提供給主進程(父進程)不再向它提供的後叉()?我認爲新的流程只是父進程的副本,父進程仍然像以前一樣,即所有的棧和堆仍然在同一個地方的叉了。非常感謝〜 – pilot

+0

在fork之後,每個進程都應該有自己獨立的全局變量副本。它不應該改變價值。我不能再具體說,因爲你沒有說全球範圍內有什麼信息。 –