0

在我包装在 python 函数中的一个 C++ 源文件中,有人包含以下内容:

namespace some_namespace 
{ 
  static double some_double; 
}

float function_that_uses_some_double(float input) { 
  // implementation
  return result; 
}

静态全局some_double只在函数内部使用,所以如果我将它包装在一个 CPython 函数中并在单线程代码中调用它,则该变量一次只能被一个函数使用。这很丑陋,但那里没有问题。我的问题是如果我使用会发生什么:

  1. threading模块,或
  2. multiprocessing模块。

当我有多个进程和/或线程使用此模块时,它们会相互干扰吗?

4

2 回答 2

1

如果您使用 threading 模块,那么所有函数将简单地共享该全局变量。python 中的线程在字节码边界之间切换,因此锁定不是问题。

如果您使用多处理模块,情况会有所不同,这在一定程度上取决于您对多处理的使用。Python 从单个进程开始,因此全局变量只有一个副本。当您开始使用多处理(即从主进程派生新的 python 进程)时,该变量的值将被复制到子进程(任务)中,但这些进程将各自拥有自己的全局变量副本。

如果您变得棘手并设置了一个共享内存段(带有 MAP_SHARED 的 mmap)并且变量是一个指针,那么指向的位置将被共享,您将需要使用锁定。

于 2012-07-14T01:34:40.927 回答
0

If you are going to change some_double (which I assume you are because it's not a const variable), then you will have to do some kind of locking (e.g. mutex) if you use multiple threads.

于 2012-05-05T18:25:38.617 回答