2017-05-11 84 views
6

如果我在芹菜運行時對tasks.py進行更改,是否有一種機制可以重新加載更新的代碼?或者我不得不關閉芹菜重新加載?Django和Celery - 在更改後將代碼重新加載到Celery

我讀了芹菜在舊版本的--autoreload說法,但在目前的版本,我不能找到它:

celery: error: unrecognized arguments: --autoreload

回答

9

不幸的是--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芹菜工人將自動重載代碼庫的變化的時候。

這僅用於開發目的,不用於生產。

1

你可以嘗試父工作進程SIGHUP,將重新啓動工人,但我不確定它是否會提取新的任務。值得一拍,想到:)

相關問題