2016-08-17 6 views
1

インポート/実行されている現在のモジュールがセロリの作業者のコンテキストで実行されていることをプログラマチックに判断する方法はありますか?私がセロリの労働者で働いているかどうかをどのように検出できますか?

Celeryワーカーを実行する前に環境変数を設定し、この環境変数をコード内でチェックすることに決めましたが、もっと良い方法があるのだろうか?

+0

'celery.current_app'おそらく? – BlackBear

答えて

0

セルラーワーカーがモジュールを実行しているかどうかを確認するには、環境変数を追加することをお勧めします。タスク・サブミッター・プロセスでは、環境変数を設定して、セルリー・ワーカーのコンテキストで実行されていないことを示すことができます。

しかし、より良い方法は、モジュールが作業者またはタスクのサブミッターで実行されているかどうかを知るのに役立つセロリー信号を使用することです。例えば、worker-process-initシグナルが各子タスク実行プログラムプロセス(preforkedモード)に送信され、ハンドラを使用してワーカープロセスであることを示すグローバル変数を設定できます。

1

ご利用の場合のシナリオを正確に、あなたは要求IDが設定されているかどうかをチェックすることにより、それを検出することができるが何であるかに応じて:

@app.task(bind=True) 
def foo(self): 
    print self.request.id 

あなたはfoo.delay()として上記を起動した場合、タスクがされます作業者に送信され、self.request.idは一意の番号に設定されます。 foo()と呼び出すと、現在のプロセスで実行され、self.request.idNoneになります。

0

名前を持つワーカーを開始して、それらの管理(停止/強制終了/再開)が容易になるようにすることをお勧めします。ワーカーに名前を付けるには-nを使用できます。

celery worker -l info -A test -n foo 

今、あなたのスクリプトの中で、あなたはその労働者が実行されているかどうかを確認するためにapp.control.inspectを使用することができます。

In [22]: import test 

In [23]: i = test.app.control.inspect(['foo']) 

In [24]: i.app.control.ping() 
Out[24]: [{'[email protected]': {'ok': 'pong'}}] 

あなたはCeleryアプリケーションインスタンスクラスからcurrent_worker_taskプロパティを使用することができますabout this in celery worker docs

0

詳細を読むことができます。

In [1]: from whatever_app.tasks import test_task 

In [2]: test_task() 
Out[2]: 'just running' 

In [3]: r = test_task.delay() 

In [4]: r.result 
Out[4]: u'running in a celery worker' 

注:明らかに成功するtest_task.delay()ため、あなたがでている必要がありますが、Pythonシェルで次のように実行することができます

# whatever_app/tasks.py 

celery_app = Celery(app) 

@celery_app.task 
def test_task(): 
    if celery_app.current_worker_task: 
     return 'running in a celery worker' 
    return 'just running' 

:定義された以下のタスクにDocs here.

whatever_app.tasksからタスクをロードし実行するように設定された少なくとも1人のセロリのワーカー。

関連する問題