猿问

Python进程池非守护进程?

是否可以创建非守护进程的python池?我希望一个池能够调用内部有另一个池的函数。


我想要这个,因为守护进程无法创建进程。具体来说,它将导致错误:


AssertionError: daemonic processes are not allowed to have children

例如,考虑这样一个场景,其中function_a有一个运行的池,function_b而有一个运行的池function_c。该功能链将失败,因为function_b它正在守护进程中运行,并且守护进程无法创建进程。


开心每一天1111
浏览 1404回答 3
3回答

阿波罗的战车

在多处理模块有一个漂亮的界面使用与进程池或线程。根据您当前的用例,您可能会考虑将其multiprocessing.pool.ThreadPool用于外部Pool,这将导致线程(允许从内部生成进程)而不是进程。它可能受到GIL的限制,但是在我的特殊情况下(我都对它们进行了测试),此处Pool创建的外部进程的启动时间远远超过了解决方案的启动时间。ThreadPool这真的很容易掉Processes的Threads。在此处或此处阅读有关如何使用ThreadPool解决方案的更多信息。

慕侠2389804

我必须在Python 3.7中使用非守护程序池,并最终改编了接受的答案中发布的代码。下面是创建非守护程序池的代码段:class NoDaemonProcess(multiprocessing.Process):    @property    def daemon(self):        return False    @daemon.setter    def daemon(self, value):        passclass 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说得那么难用非恶魔的过程,其中有许多是解释在这里。我认为最引人注目的是:至于允许子线程使用子进程来产生自己的子进程,如果父线程或子线程在子进程完成并返回之前终止,则可能会产生一些僵尸“孙子”。
随时随地看视频慕课网APP

相关分类

Python
我要回答