守护进程不允许有子进程

lin*_*gta 9 python daemon multiprocessing

我知道这是一个常见的问题,像相关的问题这样,但我要问,以适合我的情况,因为我还没有现在用芹菜最好的办法.

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

如你所知,如果我设置两个广告系列和广告制作部分多进程,它将失败,"恶魔的过程中是不允许生孩子",我觉得芹菜可满足即使我现在不使用它类似的问题.

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

非常感谢

Mit*_*ril 4

1. 一般良好的解决方法

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

例如,

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

  2. 多活动工作人员从queue_1获取任务,处理并将一些任务推multi-ad task送到queue_2

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

逻辑简单,很容易自己实现。另外还有一些此类内容的现有库,例如 rq/ celery

2. 简单的解决方法

如果 get 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)
Run Code Online (Sandbox Code Playgroud)

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