如果我在芹菜運行時對tasks.py進行更改,是否有一種機制可以重新加載更新的代碼?或者我不得不關閉芹菜重新加載?Django和Celery - 在更改後將代碼重新加載到Celery
我讀了芹菜在舊版本的--autoreload
說法,但在目前的版本,我不能找到它:
celery: error: unrecognized arguments: --autoreload
如果我在芹菜運行時對tasks.py進行更改,是否有一種機制可以重新加載更新的代碼?或者我不得不關閉芹菜重新加載?Django和Celery - 在更改後將代碼重新加載到Celery
我讀了芹菜在舊版本的--autoreload
說法,但在目前的版本,我不能找到它:
celery: error: unrecognized arguments: --autoreload
不幸的是--autoreload
不起作用,它是deprecated。
您可以使用Watchdog提供watchmedo shell實用程序來執行基於文件事件的操作。
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具有autoreload實用程序,runserver使用此實用程序在代碼更改時重新啓動WSGI服務器。
同樣的功能可以用來重新加載芹菜工人。創建一個名爲芹菜的單獨管理命令。編寫一個函數來殺死現有的工人並啓動一個新的工人。現在掛鉤這個函數來自動重載,如下所示。現在
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,將重新啓動工人,但我不確定它是否會提取新的任務。值得一拍,想到:)