我有一个使用多处理(特别是joblib)的函数来加速使用多个核的慢速例程。它很棒;没问题。
我有一个使用多处理的测试套件(目前只是multiprocessing.Pool()系统,但可以将其更改为joblib)以独立运行每个模块的测试功能。它很棒;没问题。
问题是我现在已经将多处理功能集成到模块的测试套件中,以便池进程运行多处理功能。我想这样做,以便内部函数知道它已经被多处理并且不会自行调整更多的分支。目前内部流程有时会挂起,但即使它没有,显然在已经并行的例程中多处理没有任何好处。
我可以想到几种方法(使用锁定文件,设置某种全局变量等)来确定我们所处的状态,但我想知道是否有一些标准方法可以解决这个问题(要么在PY多处理或joblib中)。如果它只适用于PY3,那就没问题,但显然在2.7或更低的情况下工作的解决方案会更好。谢谢!
答案 0 :(得分:3)
在joblib中并行应该能够解决这些问题:
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'
不知道为什么他们会从环境变量到环境变量。本身..但你可以看到。该功能已在joblib中实现。
# We can now allow subprocesses again
os.environ.pop('__JOBLIB_SPAWNED_PARALLEL__', 0)
在这里,您可以选择其他版本,如果更相关:
http://pydoc.net/Python/joblib/0.8.3-r1/
答案 1 :(得分:2)
具体问题的答案是:我不知道现成的实用程序。
最小(*)核心重构将为您当前创建子进程的函数添加命名参数。默认参数是您当前的行为,另一个值将切换到与您运行测试的方式兼容的行为(**)。
(*:可能有其他,可能更好,设计替代方案,但我们没有足够的信息) (**:有人可能会说,条件行为的引入也需要对此进行测试,我们又回到原点......)
答案 2 :(得分:0)
检查multiprocessing.current_process().daemon
-如果当前进程是衍生的,它将返回True。 (回答自己的问题)