2017-06-13 137 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

相關問題