守护进程不允许有子进程

时间:2016-08-25 08:47:42

标签: python multiprocessing daemon

我知道这是一个常见的问题,以及像http://google.com这样的相关问题,但我想要求最佳方式来适应我的情况,因为我现在还没有使用芹菜。

我的服务方案将使用multiprocessing.Process创建多个广告系列订单,在每个广告系列订单中,它仍然使用multiprocessing.Process来创建多个广告(广告系列和广告是1toM关系)。

如您所知,如果我在广告系列和广告制作部分都设置了多个流程,那么它将失败并且“守护进程不允许生孩子”,我认为即使我没有使用过,芹菜也可能会遇到类似的问题现在。

我的问题是,解决这类问题的一般方法是什么?我应该使用芹菜还是以任何方式解决它?

非常感谢

1 个答案:

答案 0 :(得分:1)

1。一般好的解决方法

您应该使用消息队列来解耦

例如,

  1. 主程序,创建任务,推送到queue_1

  2. 多个广告系列工作人员从queue_1获取任务,处理并将部分multi-ad task推送到queue_2

  3. 多广告工作人员从queue_2获取任务,处理完成。

  4. 逻辑简单,易于自己实现。此外,还有一些现有的库,例如rq / celery

    2。简单的解决方法

    如果获得AssertionError,请改用线程

    def run_in_subprocess(func, *args, **kwargs):
        from multiprocessing import Process
        thread = Process(target=func, args=args, kwargs=kwargs)
        thread.daemon = True
        thread.start()
        return thread
    
    def run_in_thread(func, *args, **kwargs):
        from threading import Thread
        thread = Thread(target=func, args=args, kwargs=kwargs)
        thread.daemon = True
        thread.start()
        return thread
    
    def run_task(config):
        try:
            run_in_subprocess(xxxx_task, config)
        except AssertionError:
            print('daemonic processes are not allowed to have children, use thread')
            run_in_thread(xxxx_task, config)
    

    我在一些演示应用中使用此代码,但我不建议在生产中使用。