【问题标题】:PeriodicTask with Django + CeleryDjango + Celery 的 PeriodicTask
【发布时间】:2015-08-27 11:25:21
【问题描述】:

我正在尝试在我的项目中执行定期任务,但我无法使其工作。在我的开发中,我像这样执行 celery:

python manage.py celery worker -l info

但是当我尝试时:

celery -B -l info

python manage.py celery -B -l info

我收到了Connection refused error。 我还安装了flower 来监控任务是否执行。我有其他任务从代码执行,但现在我想做一个定期任务。

我的任务(实际有效)继承自 celery.task.Task,而我想定期从 celery.task.PeriodicTask 继承的任务,如下所示:

from celery.task import PeriodicTask

TaskToBePeriodical(PeriodicTask):
    run_every = crontab()  # This should make it execute every minute, just for test
    def run(self, **kwargs):
        # Do something awesome...

【问题讨论】:

    标签: python django task celery


    【解决方案1】:

    您启动 celery 的命令似乎不太正确。
    根据您尝试安排的内容,您可能希望尝试将其设置为 celery.beat。

    值得注意的是,此方法不使用 django-celery,因为 Celery 文档提到“不再需要此项目”

    查看此处了解有关 celery.beat 的更多信息: http://celery.readthedocs.org/en/latest/reference/celery.beat.html

    Celery 启动命令

    celery -A proj.celery_app worker -l info -B
    

    项目目录

    +-- proj
    |   +-- celery_app.py
    |   +-- settings.py
    |   +-- urls.py
    |   +-- ...
    +-- app
    |   +-- models.py
    |   +-- tasks.py
    |   +-- urls.py
    |   +-- views.py
    |   +-- ...
    

    celery_app.py

    from __future__ import absolute_import
    
    import os
    
    from celery import Celery
    
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
    
    from django.conf import settings
    
    app = Celery('proj')
    
    # Using a string here means the worker will not have to
    # pickle the object when using Windows.
    app.config_from_object('django.conf:settings')
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    settings.py

    CELERYBEAT_SCHEDULE = {
        'name_of_task': {
            'task': 'app.tasks.periodic_task',
            'schedule': crontab()
        }
    }
    

    tasks.py

    from __future__ import absolute_import
    from celery import shared_task
    
    @shared_task
    def periodic_task():
        # Do your awesome thing
        return
    

    【讨论】:

    • 我在celery.py 中添加了一个CELERYBEAT_SCHEDULE dic(在您的示例中为celery_app.py)。但是当我运行celery worker.... 我得到No module named celery 我必须用python manage.py ... 执行它,我执行了python manage.py celery beat 并且它现在工作它(假定)正在运行。最后我使用基于类的任务,比如来自from celery.task import PeriodicTaskMyTask(PeriodicTack)
    • 谢谢!!你真的用那个命令行帮助了我,我运行了python manage.py celery worker -l info -B,现在它运行良好,我仍然不知道我需要如何使用python manage.py ...,如果你有一些想法,我会很高兴你解释我.现在我关注this 每两周执行一次,你知道吗?
    • 抱歉,回复晚了。如果你还有兴趣。我记得当我运行celery worker .... 命令时,我模糊地收到了一个问题:No module name celery。这通常是因为官方文档和许多其他指南让您将我在此处命名的同一文件命名为 celery_app.pycelery.py,这会导致 python 导入混淆。不确定您的意思是要导入实际的 celery 库或celery.py
    • 至于您关于python manage.py ... 的问题,我个人并不知道您可以使用python manage.py celery 命令运行芹菜服务器。我只使用过python manage.py ... 来运行 django 特定的命令。但这很有意义,因为它会自动导入您的项目设置。我实际上结束了编写一个脚本来处理为我的应用部署导入应用设置。
    猜你喜欢
    • 2015-06-06
    • 2011-02-03
    • 1970-01-01
    • 2013-07-07
    • 2013-03-18
    • 2017-02-01
    • 2019-11-15
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多