2017-05-11 6 views
6

セロリの実行中にtasks.pyを変更した場合、更新されたコードを再読み込みできるメカニズムはありますか?またはセロリを再ロードする必要がありますか?DjangoとCelery - 変更後にセロリにコードを再読み込みする

私はセロリが古いバージョンで--autoreload引数を持っていた読んで、私は、現在のバージョンでそれを見つけることができません。

celery: error: unrecognized arguments: --autoreload

答えて

9

残念ながら--autoreloadは働かず、deprecatedです。

watchdogを使用すると、ファイルのイベントに基づいてアクションを実行するシェルの機能を監視できます。

pip install watchdog 

あなたはそれが現在のディレクトリ内のすべてのファイルを監視しますデフォルトでは

watchmedo auto-restart -- celery worker -l info -A foo 

で労働者を開始することができます。対応するパラメータを渡すことで変更できます。

watchmedo auto-restart -d . -p '*.py' -- celery worker -l info -A foo 

djangoを使用しており、ウォッチドッグに依存したくない場合は、これを達成するための簡単なやり方があります。 Djangoには、コードが変更されたときにrunserverがWSGIサーバーを再起動するために使用するautoreloadユーティリティがあります。

同じ機能を使用してセロリの作業者をリロードすることができます。 celeryという別個の管理コマンドを作成します。既存の労働者を殺し、新しい労働者を開始するための関数を書く。次のように、この関数を自動ロードにフックします。

import shlex 
import subprocess 

from django.core.management.base import BaseCommand 
from django.utils import autoreload 


def restart_celery(): 
    cmd = 'pkill celery' 
    subprocess.call(shlex.split(cmd)) 
    cmd = 'celery worker -l info -A foo' 
    subprocess.call(shlex.split(cmd)) 


class Command(BaseCommand): 

    def handle(self, *args, **options): 
     print('Starting celery worker with autoreload...') 
     autoreload.main(restart_celery) 

今、あなたは、コードベースの変更自動再ますpython manage.py celeryとセロリの労働者を実行することができます。

これは開発目的のみであり、本番環境では使用しません。

1

あなたは親ワーカープロセスにSIGHUPを試みることができる、それが労働者を再起動しますしかし、私はそれが新しい仕事を拾うかわからない。価値があると思う:)

関連する問題