为了账号安全,请及时绑定邮箱和手机立即绑定

Python进程池非守护进程?

Python进程池非守护进程?

开心每一天1111 2019-10-08 15:26:19
是否可以创建非守护进程的python池?我希望一个池能够调用内部有另一个池的函数。我想要这个,因为守护进程无法创建进程。具体来说,它将导致错误:AssertionError: daemonic processes are not allowed to have children例如,考虑这样一个场景,其中function_a有一个运行的池,function_b而有一个运行的池function_c。该功能链将失败,因为function_b它正在守护进程中运行,并且守护进程无法创建进程。
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

在多处理模块有一个漂亮的界面使用与进程池或线程。根据您当前的用例,您可能会考虑将其multiprocessing.pool.ThreadPool用于外部Pool,这将导致线程(允许从内部生成进程)而不是进程。


它可能受到GIL的限制,但是在我的特殊情况下(我都对它们进行了测试),此处Pool创建的外部进程的启动时间远远超过了解决方案的启动时间。ThreadPool


这真的很容易掉Processes的Threads。在此处或此处阅读有关如何使用ThreadPool解决方案的更多信息。


查看完整回答
反对 回复 2019-10-08
?
慕侠2389804

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说得那么难用非恶魔的过程,其中有许多是解释在这里。我认为最引人注目的是:

至于允许子线程使用子进程来产生自己的子进程,如果父线程或子线程在子进程完成并返回之前终止,则可能会产生一些僵尸“孙子”。


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 1403 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信