首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python进程池不是守护进程?

Python进程池不是守护进程?
EN

Stack Overflow用户
提问于 2011-08-08 02:08:04
回答 3查看 62.8K关注 0票数 122

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

我之所以需要它,是因为守护进程不能创建进程。具体来说,它会导致以下错误:

代码语言:javascript
复制
AssertionError: daemonic processes are not allowed to have children

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-23 02:46:24

multiprocessing.pool.Pool类在其__init__方法中创建工作进程,使其成为守护进程并启动它们,并且在它们启动之前不能将它们的daemon属性重新设置为False (之后就不允许这样做了)。但是您可以创建自己的multiprocesing.pool.Pool子类(multiprocessing.Pool只是一个包装器函数),并替换为您自己的multiprocessing.Process子类,它总是非守护进程,用于工作进程。

这里有一个完整的例子来说明如何做到这一点。重要的部分是顶部的两个类NoDaemonProcessMyPool,以及最后在MyPool实例上调用pool.close()pool.join()

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import multiprocessing
# We must import this explicitly, it is not imported by the top-level
# multiprocessing module.
import multiprocessing.pool
import time

from random import randint


class NoDaemonProcess(multiprocessing.Process):
    # make 'daemon' attribute always return False
    def _get_daemon(self):
        return False
    def _set_daemon(self, value):
        pass
    daemon = property(_get_daemon, _set_daemon)

# 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):
    Process = NoDaemonProcess

def sleepawhile(t):
    print("Sleeping %i seconds..." % t)
    time.sleep(t)
    return t

def work(num_procs):
    print("Creating %i (daemon) workers and jobs in child." % num_procs)
    pool = multiprocessing.Pool(num_procs)

    result = pool.map(sleepawhile,
        [randint(1, 5) for x in range(num_procs)])

    # The following is not really needed, since the (daemon) workers of the
    # child's pool are killed when the child is terminated, but it's good
    # practice to cleanup after ourselves anyway.
    pool.close()
    pool.join()
    return result

def test():
    print("Creating 5 (non-daemon) workers and jobs in main process.")
    pool = MyPool(5)

    result = pool.map(work, [randint(1, 5) for x in range(5)])

    pool.close()
    pool.join()
    print(result)

if __name__ == '__main__':
    test()
票数 136
EN

Stack Overflow用户

发布于 2019-01-22 16:34:05

在一些Python版本中,将标准池替换为自定义会引发错误:AssertionError: group argument must be None for now

Here我找到了一个可以帮助你的解决方案:

代码语言:javascript
复制
class NoDaemonProcess(multiprocessing.Process):
    # make 'daemon' attribute always return False
    @property
    def daemon(self):
        return False

    @daemon.setter
    def daemon(self, val):
        pass


class NoDaemonProcessPool(multiprocessing.pool.Pool):

    def Process(self, *args, **kwds):
        proc = super(NoDaemonProcessPool, self).Process(*args, **kwds)
        proc.__class__ = NoDaemonProcess

        return proc
票数 7
EN

Stack Overflow用户

发布于 2020-05-08 17:52:17

我见过有人使用celerymultiprocessing分支billiard (多进程池扩展)来处理这个问题,它允许守护进程派生子进程。

代码语言:javascript
复制
import billiard as multiprocessing
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6974695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档