2017-05-11 3 views
6

셀러리가 실행되는 동안 tasks.py를 변경하면 업데이트 된 코드를 다시로드 할 수있는 메커니즘이 있습니까? 셀러리를 다시로드해야합니까? 장고와 셀러리 - 변경 후 셀러리에 코드 다시 넣기

나는 셀러리는 이전 버전의 --autoreload 인수했다 읽을 수 있지만 나는 현재 버전에서 찾을 수 없습니다

celery: error: unrecognized arguments: --autoreload

답변

9

불행히도 --autoreload은 작동하지 않으며 deprecated입니다.

Watchdog을 사용하면 watch 이벤트를 제공하여 파일 이벤트를 기반으로 작업을 수행 할 수 있습니다.

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을 시도해 볼 수도 있습니다, 그것은 노동자를 다시 시작 ,하지만 그것이 새로운 작업을 선택하는지 모르겠습니다. 가치가있는 것 :

관련 문제