Celery 在任何更改时自动重新加载

2024-02-29

当模块发生更改时,我可以使 celery 自动重新加载CELERY_IMPORTS in settings.py.

我尝试让母模块检测子模块的变化,但它没有检测到子模块的变化。这让我明白检测不是由 celery 递归完成的。我在文档中搜索了它,但没有找到针对我的问题的任何回复。

将我的项目中与芹菜相关的所有内容添加到中真的很困扰CELERY_IMPORTS来检测变化。

有没有办法告诉芹菜“当项目的任何地方发生任何变化时自动重新加载”。

谢谢你!


Celery --autoreload不起作用,它是已弃用 https://github.com/celery/celery/issues/1658.

由于您使用的是 django,因此您可以为此编写一个管理命令。 Django 有 autoreload 实用程序,runserver 使用它在代码更改时重新启动 WSGI 服务器。

相同的功能可用于重新加载 celery 工作线程。创建一个名为 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...')

        # For Django>=2.2
        autoreload.run_with_reloader(restart_celery) 

        # For django<2.1
        # autoreload.main(restart_celery)

现在你可以运行 celery workerpython manage.py celery当代码库发生变化时,它将自动重新加载。

这仅用于开发目的,请勿在生产中使用。代码取自我的其他答案在这里 https://stackoverflow.com/a/43929298/2698552.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Celery 在任何更改时自动重新加载 的相关文章

随机推荐