函数可以知道它们是否已经在 Python (joblib) 中被多处理

Can functions know if they are already multiprocessed in Python (joblib)

我有一个函数使用多处理(特别是 joblib)来加速使用多个内核的慢速例程。效果很好;没有问题。

我有一个使用多处理(目前只有 multiprocessing.Pool() 系统,但可以将其更改为 joblib)的测试套件 运行 每个模块的独立测试功能。效果很好;没有问题。

问题是我现在已经将多处理函数集成到模块的测试套件中,因此池进程 运行 是多处理函数。我想这样做,以便内部函数知道它已经在进行多处理,而不是旋转更多的自身分支。目前,内部进程有时会挂起,但即使没有挂起,显然在已经并行的例程中进行多处理也没有任何好处。

我可以想出几种方法(使用锁定文件、设置某种全局变量等)来确定我们所处的状态,但我想知道是否有某种标准方法可以解决这个问题(在 PY multiprocessing 或 joblib 中)。如果它只适用于 PY3,那很好,但显然也适用于 2.7 或更低版本的解决方案会更好。谢谢!

具体问题的答案是:我不知道有现成的实用程序。

最小 (*) 核心重构将向当前创建子进程的函数添加命名参数。默认参数将是您当前的行为,另一个值将切换为与您的行为兼容的行为 运行 tests(**).

(*:可能还有其他更好的设计方案可供考虑,但我们没有足够的信息) (**: 有人可能会说引入条件行为也需要对其进行测试,我们回到原点...)

joblib 中的 Parallel 应该可以解决这些问题:
http://pydoc.net/Python/joblib/0.8.3-r1/joblib.parallel/

来自 0.8.3-r1 的两个片段:

# Set an environment variable to avoid infinite loops
os.environ[JOBLIB_SPAWNED_PROCESS] = '1'

不知道为什么他们从指环境的变量转到 env。本身..但是正如你所看到的。该功能已在 joblib 中实现。

# We can now allow subprocesses again
os.environ.pop('__JOBLIB_SPAWNED_PARALLEL__', 0)


在这里你可以 select 其他版本,如果更相关的话:
http://pydoc.net/Python/joblib/0.8.3-r1/

检查 multiprocessing.current_process().daemon -- 如果当前进程是衍生进程,它将 return 为真。 (回答自己的问题)