在我正在python函数中包装的一个C ++源文件中,有人包括以下内容:
namespace some_namespace
{
static double some_double;
}
float function_that_uses_some_double(float input) {
// implementation
return result;
}
静态全局some_double
只在函数内部使用,所以如果我将它包装在CPython函数中并用单线程代码调用它,那么变量一次只能由一个函数使用。这很难看,但那里没问题。我的问题是如果我使用会发生什么:
threading
模块或multiprocessing
模块。 当我使用此模块有多个进程和/或线程时,它们是否会相互干扰?
答案 0 :(得分:1)
如果使用线程模块,则所有函数将只共享该全局变量。 python中的线程在字节码边界之间切换,因此锁定不是问题。
如果使用多处理模块,情况会有所不同,这取决于您对多处理的使用。 Python以单个进程开始,因此,只有一个全局变量的副本。当您开始使用多处理(即从主进程分支新的python进程)时,该变量的值将被复制到子进程(任务)中,但这些进程将各自拥有自己的全局变量副本。
如果你变得棘手并设置一个共享内存段(带有MAP_SHARED的mmap)并且变量是一个指针,那么指向的位置将被共享,你需要使用锁定。
答案 1 :(得分:0)
如果要更改some_double(我假设你是因为它不是const变量),那么如果使用多个线程,则必须进行某种锁定(例如mutex)。