2017-06-13 135 views
2

我有一个沉重的外部库类需要时间来初始化和消耗大量的内存。我想至少每个任务实例创建一次。是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. 

芹菜开始32个工作进程,所以我期望的打印"initializing ... done" 32倍,因为我认为一个任务实例每个每个工人创造。令人惊讶的是,我得到了印刷一次。那里真的发生了什么?谢谢。

回答

1

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

如果你有两个任务,如

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


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

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

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

from celery.signals import worker_process_init 


@worker_process_init.connect() 
def setup(**kwargs): 
    print('initializing NLP parser') 
    # setup 
    print('done initializing NLP parser') 

现在,当你启动工作,你会看到安装程序是由每个进程调用一次。

+0

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

+0

@davka更新回答。 – ChillarAnand

相关问题