2012-10-10 65 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之后,每个进程都应该有自己独立的全局变量副本。它不应该改变价值。我不能再具体说,因为你没有说全球范围内有什么信息。 –