Django和Celery - 在更改后将代码重新加载到Celery中

Jas*_*enX 20 django celery django-celery

如果我在芹菜运行时对tasks.py进行了更改,是否有一种机制可以重新加载更新的代码?或者我必须关闭芹菜重新装载?

我读过芹菜--autoreload在旧版本中有一个参数,但我在当前版本中找不到它:

celery: error: unrecognized arguments: --autoreload

Chi*_*and 35

不幸的是--autoreload不起作用,它已被弃用.

您可以使用Watchdog为Watchmedo提供shell实用程序,以根据文件事件执行操作.

pip install watchdog
Run Code Online (Sandbox Code Playgroud)

你可以开始工作

watchmedo auto-restart -- celery worker -l info -A foo
Run Code Online (Sandbox Code Playgroud)

默认情况下,它将监视当前目录中的所有文件.这些可以通过传递相应的参数来改变.

watchmedo auto-restart -d . -p '*.py' -- celery worker -l info -A foo
Run Code Online (Sandbox Code Playgroud)

如果你正在使用django并且不想依赖看门狗,那么有一个简单的技巧可以实现这一点.Django具有自动重载实用程序,当代码更改时,runserver将使用该实用程序重新启动WSGI服务器.

相同的功能可用于重新加载芹菜工人.创建一个名为celery的独立管理命令.编写一个函数来杀死现有的worker并启动一个新的worker.现在将此函数挂钩到autoreload,如下所示.

import sys

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


class Command(BaseCommand):
    def handle(self, *args, **options):
        autoreload.run_with_reloader(self._restart_celery)

    @classmethod
    def _restart_celery(cls):
        if sys.platform == "win32":
            cls.run('taskkill /f /t /im celery.exe')
            cls.run('celery -A phoenix worker --loglevel=info --pool=solo')
        else:  # probably ok for linux2, cygwin and darwin. Not sure about os2, os2emx, riscos and atheos
            cls.run('pkill celery')
            cls.run('celery worker -l info -A foo')

    @staticmethod
    def run(cmd):
        subprocess.call(shlex.split(cmd))
Run Code Online (Sandbox Code Playgroud)

现在,您可以运行celery worker,python manage.py celery在代码库更改时将自动加载.

这仅用于开发目的,不在生产中使用.

  • 如果您的目录安装在 docker 上,以便主机上的任何更改都会反映在 docker 上,那么它应该可以工作。 (3认同)
  • 优雅地关闭怎么样?我想要完成待处理的任务。 (2认同)