Celery定期任务未执行。

17

我正在学习Celery,并创建了一个项目来测试我的配置。我根据最新的文档安装了celery==4.0.0django-celery-beat==1.0.1

在drf_project(带有manage.py的主项目目录)/ drf_project / celery.py中:

from __future__ import absolute_import, unicode_literals
from celery import Celery
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_project.settings')
app = Celery('drf_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

在drf_project/drf_project/settings.py中

INSTALLED_APPS += ('django_celery_beat',)
CELERYBEAT_SCHEDULE = {
    "test_1": {
        "task": "tasks.print_test",
        "schedule": timedelta(seconds=2),
    },
}

在drf_project/drf_project/init.py中。

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ['celery_app']

在我的用户管理应用程序(drf_project/user_management/)中,我添加了一个tasks.py文件

from celery import Celery
from time import strftime

app = Celery()

@app.task
def print_test():
    print strftime('%Y-%m-%d %H:%M:%S')
    with open('abc.txt', 'ab+') as test_file:
        test_file.writeline(strftime('%Y-%m-%d %H:%M:%S'))

当我在不同的终端中运行celery worker和Django项目开发服务器时:

 celery -A drf_project worker -l info

 python manage.py runserver

我可以在celery日志中看到我的任务:

[tasks]
   . user_management.tasks.print_test

但它没有执行。同时我也没有收到任何错误信息。那么我做错了什么?我遵循了celery的官方文档。


什么是解决方案?我也遇到了同样的问题。 - Parikshit Chalke
请检查标记的答案。文档中指出您需要单独运行调度程序。 - Manish Gupta
2个回答

35

要运行周期性任务,您需要同时运行两个服务:celery beatcelery worker

您可以在以下页面底部找到更多信息。


2
我通过 celery -A drf_project beat 启动了beat服务。但是任务仍未执行,我无法在Django服务器和Celery中看到任何日志记录。 - Manish Gupta
19
我需要几天时间才找到答案。 这个程序只是在任务到期时发送它们的节拍声。这些任务将排队等待执行,因此您必须启动至少一个工作线程以便选择并执行这些任务! - Dat TT
@ManishGupta,您能否根据DatTT的评论更新您的答案? - Arpit Solanki
@DaTT,你刚刚节省了我好几天的时间。 ;) - FiniteElement
简短的回答就是在你的 celery worker 命令中添加 -B,例如 celery -A proj worker -B。虽然这不建议用于生产环境,但这是一个快速启动的好方法。 - Migwell
谢谢!另外一个问题是在生产环境中同时运行它们。在开发环境中,你只需打开另一个标签页,但在生产环境中,你需要服务和守护进程。 - Hvitis

0

这是我设置的docker-compose文件配置,用于运行celery worker和celery beat。它可以完成工作。请确保您在下面的docker-compose文件中更改main_project_folder名称:

version: '3'

services:
  
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"

  worker:
    build:
      context: .
      dockerfile: Dockerfile
    image: madefire/chordtest
    command: bash -c "celery -A main_project_folder_name worker -l INFO"
    environment:
      - BROKER_URL=redis://redis:6379/0
      - RESULT_BACKEND=redis://redis:6379/0
      - C_FORCE_ROOT=true
    volumes:
      - ./:/app/
    depends_on:
      - redis

  celery_beat:
    build:
      context: .
      dockerfile: Dockerfile
    image: madefire/chordtest
    command: bash -c "celery -A main_project_folder_name beat"
    environment:
      - BROKER_URL=redis://redis:6379/0
      - RESULT_BACKEND=redis://redis:6379/0
      - C_FORCE_ROOT=true
    volumes:
      - ./:/app/
    depends_on:
      - redis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接