3 回答
TA贡献1862条经验 获得超6个赞
在多处理模块有一个漂亮的界面使用与进程池或线程。根据您当前的用例,您可能会考虑将其multiprocessing.pool.ThreadPool用于外部Pool,这将导致线程(允许从内部生成进程)而不是进程。
它可能受到GIL的限制,但是在我的特殊情况下(我都对它们进行了测试),此处Pool创建的外部进程的启动时间远远超过了解决方案的启动时间。ThreadPool
这真的很容易掉Processes的Threads。在此处或此处阅读有关如何使用ThreadPool解决方案的更多信息。
TA贡献1719条经验 获得超6个赞
我必须在Python 3.7中使用非守护程序池,并最终改编了接受的答案中发布的代码。下面是创建非守护程序池的代码段:
class NoDaemonProcess(multiprocessing.Process):
@property
def daemon(self):
return False
@daemon.setter
def daemon(self, value):
pass
class NoDaemonContext(type(multiprocessing.get_context())):
Process = NoDaemonProcess
# We sub-class multiprocessing.pool.Pool instead of multiprocessing.Pool
# because the latter is only a wrapper function, not a proper class.
class MyPool(multiprocessing.pool.Pool):
def __init__(self, *args, **kwargs):
kwargs['context'] = NoDaemonContext()
super(MyPool, self).__init__(*args, **kwargs)
由于的当前实现multiprocessing已被广泛地重构为基于上下文,因此我们需要提供一个NoDaemonContext具有NoDaemonProcessas属性的类。MyPool然后将使用该上下文,而不是默认上下文。
就是说,我应该警告这种方法至少有两个警告:
它仍然取决于multiprocessing软件包的实现细节,因此可能随时中断。
为什么有正当的理由multiprocessing说得那么难用非恶魔的过程,其中有许多是解释在这里。我认为最引人注目的是:
至于允许子线程使用子进程来产生自己的子进程,如果父线程或子线程在子进程完成并返回之前终止,则可能会产生一些僵尸“孙子”。
添加回答
举报