函数能否知道它们是不是已经在 Python 中进行了多处理(joblib)
Posted
技术标签:
【中文标题】函数能否知道它们是不是已经在 Python 中进行了多处理(joblib)【英文标题】:Can functions know if they are already multiprocessed in Python (joblib)函数能否知道它们是否已经在 Python 中进行了多处理(joblib) 【发布时间】:2016-03-29 01:58:04 【问题描述】:我有一个函数,它使用多处理(特别是 joblib)来加速使用多个内核的慢速例程。效果很好;没有问题。
我有一个使用多处理的测试套件(目前只是 multiprocessing.Pool() 系统,但可以将其更改为 joblib)来独立运行每个模块的测试功能。效果很好;没有问题。
问题是我现在已经将多处理功能集成到模块的测试套件中,以便池进程运行多处理功能。我想让它让内部函数知道它已经被多处理并且不会启动更多自己的分支。目前,内部进程有时会挂起,但即使没有,显然在已经并行的例程中进行多处理也没有任何好处。
我可以想到几种方法(使用锁定文件、设置某种全局变量等)来确定我们所处的状态,但我想知道是否有一些标准的方法来解决这个问题(或者在 PY 多处理或 joblib 中)。如果它只适用于 PY3,那很好,但显然也适用于 2.7 或更低版本的解决方案会更好。谢谢!
【问题讨论】:
【参考方案1】: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'
不知道为什么他们从引用环境的变量转到环境。本身..但正如你所看到的。该功能已在 joblib 中实现。
# We can now allow subprocesses again
os.environ.pop('__JOBLIB_SPAWNED_PARALLEL__', 0)
如果更相关,您可以在此处选择其他版本:http://pydoc.net/Python/joblib/0.8.3-r1/
【讨论】:
【参考方案2】:具体问题的答案是:我不知道现成的实用程序。
最小(*)核心重构将是向当前创建子进程的函数添加一个命名参数。默认参数将是您当前的行为,而其他值将切换为与您运行测试的方式兼容的行为(**)。
(*: 可能还有其他更好的设计方案可供考虑,但我们没有足够的信息) (**:有人可能会说引入条件行为也需要对其进行测试,我们又回到了原点......)
【讨论】:
【参考方案3】:检查multiprocessing.current_process().daemon
——如果当前进程是衍生进程,它将返回True。 (回答自己的问题)
【讨论】:
以上是关于函数能否知道它们是不是已经在 Python 中进行了多处理(joblib)的主要内容,如果未能解决你的问题,请参考以下文章
python tkinter button中的command能否直接给变量赋值?