セロリの実行中にtasks.pyを変更した場合、更新されたコードを再読み込みできるメカニズムはありますか?またはセロリを再ロードする必要がありますか?DjangoとCelery - 変更後にセロリにコードを再読み込みする
私はセロリが古いバージョンで--autoreload
引数を持っていた読んで、私は、現在のバージョンでそれを見つけることができません。
celery: error: unrecognized arguments: --autoreload
セロリの実行中にtasks.pyを変更した場合、更新されたコードを再読み込みできるメカニズムはありますか?またはセロリを再ロードする必要がありますか?DjangoとCelery - 変更後にセロリにコードを再読み込みする
私はセロリが古いバージョンで--autoreload
引数を持っていた読んで、私は、現在のバージョンでそれを見つけることができません。
celery: error: unrecognized arguments: --autoreload
残念ながら--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
とセロリの労働者を実行することができます。
これは開発目的のみであり、本番環境では使用しません。
あなたは親ワーカープロセスにSIGHUPを試みることができる、それが労働者を再起動しますしかし、私はそれが新しい仕事を拾うかわからない。価値があると思う:)