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

问题描述 投票:15回答:3

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

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

问题是,我现在已将多处理功能集成到模块的测试套件中,以便池进程运行多处理功能。我想这样做,以便内部函数知道它已经被多进程处理,而不是增加自身的派生。当前,内部进程有时会挂起,但是即使没有挂起,显然在已经并行的例程中进行多处理也无济于事。

我可以想到几种方法(使用锁定文件,设置某种全局变量等)来确定我们所处的状态,但是我想知道是否有某种标准的方法可以解决此问题( PY多重处理或在joblib中)。如果只能在PY3中使用,那很好,尽管显然也可以在2.7或更低版​​本上使用的解决方案会更好。谢谢!

python python-multiprocessing joblib
3个回答
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/


2
投票

特定问题的答案是:我不知道现成的实用程序。

Aminimum(*)核心重构是将一个命名参数添加到当前正在创建子进程的函数中。默认参数是您当前的行为,另一个值将切换为与您运行测试的方式兼容的行为(**)。

(* *可能还有其他可能更好的设计替代方案要考虑,但我们没有足够的信息)(**:有人可能会说引入条件行为也需要对此进行检验,我们回到正题了……)


0
投票

检查multiprocessing.current_process().daemon-如果当前进程是一个已生成的进程,它将返回True。 (回答自己的问题)

© www.soinside.com 2019 - 2024. All rights reserved.