【问题标题】:In celery 3.1, making django periodic task在 celery 3.1 中,制作 django 周期性任务
【发布时间】:2013-12-05 15:55:30
【问题描述】:

Django 中的变化太大,所以我不能使用 3.1。我需要一些帮助。

我阅读了有关 make a task in django 的信息,并阅读了 Periodic Tasks 文档。但我不知道如何在 django 中进行周期性任务。我认为这是因为我的英语水平低..

在旧版本的 Celery 中,我导入了 djcelery&crontab 并在 settings.py 中设置了 CELERYBEAT_SCHEDULE,并由 执行manage.py.

但是我好像不能再用那种方式执行芹菜恶魔了。比我应该把 CELERYBEAT_SCHEDULE 放在哪里?在文档中的 django 示例中,他们设置了 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')proj/proj/celery.py 中。 (1) 那么在settings.py中设置celerybeat(和之前一样)可以吗?

(2) 如果可以的话,一个在 django 中制作周期性任务的小例子会很有帮助。当我阅读教程时,最令人困惑的部分是文件路径。如果您不想提供完整的示例,如果您解释我应该在哪里创建任务、设置节拍和执行守护进程,我将不胜感激。

感谢阅读。

【问题讨论】:

    标签: django celery celerybeat


    【解决方案1】:

    我假设您已经阅读了文档中的django section,但是您是否看过这个example project

    它不使用调度器,但如果你将它添加到settings.py:

    from __future__ import absolute_import
    
    from celery.schedules import crontab
    
    
    CELERYBEAT_SCHEDULE = {
        # crontab(hour=0, minute=0, day_of_week='saturday')
        'schedule-name': {  # example: 'file-backup' 
            'task': 'some_django_app.tasks....',  # example: 'files.tasks.cleanup' 
            'schedule': crontab(...)
        },
    }
    
    # if you want to place the schedule file relative to your project or something:
    CELERYBEAT_SCHEDULE_FILENAME = "some/path/and/filename"
    

    现在是命令,忘记manage.py,直接输入celery

    -B 一如既往地启用 celery beat。

    -A 指定 celery 应用的名称。注意示例项目的celery.py 中的这一行:app = Celery('proj')

    celery -A proj worker -B -l info
    

    'django-celery' 不需要,只有在需要管理时才安装它 来自管理员的计划,或者如果您想将任务结果存储在数据库中 通过 django 的 ORM:

    INSTALLED_APPS += ('djcelery',)
    
    # store schedule in the DB:
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
    

    【讨论】:

    • from celery.schedules import crontab 这行给了我错误:“没有名为 schedules 的模块”
    • @JonCrowell 刚刚检查并且导入是正确的。您的设置一定有问题。
    • 您是否在设置文件中添加了from __future__ import absolute_import?如果不是,python 将尝试从您的 celery.py 文件中导入计划。
    • 直接来自 celery doc """你也可以通过启用 workers -B 选项开始在worker中嵌入beat,如果你永远不会运行多个worker节点,这很方便,但它不常用因此不建议用于生产用途:$ celery -A proj worker -B"""
    • 注意 - 现在需要将其称为 CELERY_BEAT_SCHEDULE(最新版本)
    【解决方案2】:

    您可以使用 django-celery 应用程序:https://pypi.python.org/pypi/django-celery

    安装

    pip install django-celery
    

    要为您的项目启用 django-celery,您需要将 djcelery 添加到 INSTALLED_APPS:

    INSTALLED_APPS += ("djcelery", )
    CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
    

    然后将以下行添加到您的 settings.py:

    import djcelery
    djcelery.setup_loader()
    

    用法

    在 linux 上,你可以像这样使用 celery-beat 运行 worker:

    python manage.py celeryd worker --loglevel=DEBUG  -E -B -c 1
    python manage.py help celeryd #to find out the args meaning
    

    您还想在 django admin 中监控任务。要启用监控功能,您需要运行 celerycam:

    python /var/www/gorod/manage.py celerycam
    

    要制作周期性任务,您可以使用 celery.decorators.periodic_task。

    # myapp/tasks.py
    import datetime
    import celery
    
    @celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5))
    def myfunc():
        print 'periodic_task'
    

    或者使用

    # settings.py
    CELERYBEAT_SCHEDULE = {
        'add-every-30-seconds': {
            'task': 'tasks.add',
            'schedule': timedelta(seconds=30),
            'args': (16, 16)
        },
    }
    

    【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2019-02-16
    • 2016-01-14
    • 2017-04-28
    • 2012-01-03
    • 2016-02-04
    相关资源
    最近更新 更多