【问题标题】:C static variables in python multi-processpython多进程中的C静态变量
【发布时间】:2012-09-30 10:20:42
【问题描述】:

这里我有一个用 C++ 编写的函数调用 foo 并通过使用用 C 编写的 python 包装器 (wrapper.c) 使其可从 python 调用 (foo_wrapper)。

在 wrapper.c 中,我有一个静态全局变量“x”,由 foo 使用和更新。

现在,当我在一个进程中从 python 调用 foo 时,一切正常。

然而,当我在 python 中使用 multiprocess 模块时,即使 foo 是从主进程调用的,这个“x”值不是它应该的!调用过程是这样的:

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

我的问题是:当调用 fork() 时,即启动多个进程,python 如何处理父/子进程的堆栈或堆?我怎样才能使主进程(或父进程)的“x”值正确?

【问题讨论】:

  • '这个“x”值不应该是这样!!' ——你能再描述一下吗?它有什么问题?
  • x 被初始化一次。但是fork之后,主进程中的x值并没有加载,即和之前不一样了。

标签: python static-variables multiprocess


【解决方案1】:

C++ 全局变量仅对单个进程是全局的。如果您使用multiprocessing 模块,那么根据定义,您将拥有多个进程,每个进程都有自己的全局变量视图。 Python 没有做任何特殊的事情来影响这种行为。

假设您可以控制 C++ 代码,我建议对其进行重构,以使这种全局状态以 Python 可以序列化和反序列化的形式对 Python 可见。然后,您可以在需要时在进程之间传递状态(例如,使用来自multiprocessing 的队列类之一)。

【讨论】:

  • 酷!但是你能解释一下,为什么在fork之后,主进程(父进程)可用的全局变量在fork()之后不再可用?我认为新进程只是父进程的副本,父进程仍然和以前一样,即所有的堆栈和堆仍然在与 fork 之前相同的位置。非常感谢~
  • fork之后,每个进程都应该有自己独立的全局变量副本。它不应该改变价值。我不能更具体,因为你没有说全局中保存了什么样的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多