2017-06-13 11 views
2

私は初期化に時間がかかり、多くのメモリを消費する重い外部ライブラリクラスを持っています。タスクインスタンスごとに最低1回は作成したいと思います。は、各ワーカープロセスごとに、またはアプリケーションごとに1回ずつ初期化された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つの初期化が表示されます。

作業者ごとに1回初期化する場合は、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') 

作業者を開始すると、各プロセスでセットアップが1回呼び出されます。

+0

これは私の主張です。私は一人一人が一度は期待していましたが、それはセロリインスタンスごとに1回のようです。私は質問を編集しました – davka

+0

@davka更新答え。 – ChillarAnand

関連する問題