2016-08-25 101 views
6

我知道这是一个常见问题,并且像this这样的相关问题,但我想问一个适合我的场景的最佳方法,因为我现在还没有使用芹菜。守护进程不允许有孩子

我的服务场景将使用multiprocessing.Process创建多活动订单,在每个活动订单中它仍然使用多处理。创建多广告的过程(活动和广告是1toM关系)。如您所知,如果我在广告系列和广告制作部分设置了多个进程,它将会失败,并显示“守护进程不允许有孩子”,我认为芹菜可能会遇到类似的问题,即使我没有现在使用它。

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

非常感谢

回答

0

1.一般好的工作

您应该使用消息队列解耦

例如,

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

  2. multi-campaign worker get get来自队列_1的任务,处理并将一些multi-ad task推送到队列_2

  3. 多广告工作者从队列2中获取任务,处理完成。

该逻辑很简单,易于自己实现。还有一些现有的库,如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) 

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