是每个工作进程初始化Celery任务,还是每个应用程序初始化一次?

时间:2017-06-13 09:48:22

标签: python python-3.x multiprocessing celery celery-task

我有一个沉重的外部库类,需要时间来初始化并消耗大量内存。我想为每个任务实例创建一次,至少。

class NlpTask(Task):
    def __init__(self):
        print('initializing NLP parser')
        self._parser = nlplib.Parser()
        print('done initializing NLP parser')

    @property
    def parser(self):
        return self._parser

@celery.task(base=NlpTask)
def my_task(arg):
    x = my_task.parser.process(arg)
    # etc.

Celery启动32个工作进程,所以我希望打印"initializing ... done" 32次,因为我假设每个工作者都创建了一个任务实例。令人惊讶的是,我一次打印。那里到底发生了什么?谢谢。

2 个答案:

答案 0 :(得分:1)

您的E1在向工作人员注册时正在初始化。

如果你有两个任务,比如

NlpTask

然后当你启动一个工人时,你会看到2个初始化。

如果您想为每个工作人员初始化一次,您可以使用worker_process_init信号。

@celery.task(base=NlpTask)
def foo(arg):
    pass


@celery.task(base=NlpTask)
def bar(arg):
    pass

现在,当你启动一个worker时,你会看到每个进程调用一次setup。

答案 1 :(得分:1)

为此:

这就是我的意思-我希望每个工人一次,似乎每个芹菜实例一次。我编辑了问题– @davka

答案必须使用connect中的发件人过滤器,例如:

@worker_process_init.connect(sender='xx')
def func(sender, **kwargs):
    if sender == 'xx':
        # dosomething

但是我发现它在celery 4.0.2中不起作用。