安排新任务后,之前安排的任务不会被 Celery Beat (Django) 执行

问题描述 投票:0回答:1

我有一个 Django (4.2.2) 应用程序,使用 Python (3.10.12)、Celery (5.4.0)、Celery Beat (2.6.0)、Django Celery Results (2.5.1)、Redis 和 Postgres 运行。

这是我的芹菜配置:

CELERY_BROKER_URL = "redis://localhost:6379/3"

from __future__ import absolute_import, unicode_literals
from celery import Celery
from django.conf import settings
import os
import django

# Set the DJANGO_SETTINGS_MODULE before calling django.setup()
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'auctopus.settings')
django.setup()

# Initialize Celery
app = Celery('proj')
app.conf.enable_utc = False
app.conf.broker_connection_retry_on_startup = True
app.conf.task_serializer = 'json'
app.conf.accept_content = ['application/json']
app.conf.result_serializer = 'json'
app.conf.timezone = 'Asia/Kolkata'
app.conf.cache_backend = 'default'
app.conf.database_engine_options = {'echo': True}
app.conf.result_backend = 'django-db'
app.conf.result_expires = 3600
app.conf.task_time_limit = 1000
app.conf.task_default_queue ='default'
app.conf.worker_concurrency = 6

app.config_from_object(settings, namespace='CELERY')

# Autodiscover tasks from installed apps
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.conf.beat_scheduler = 'django_celery_beat.schedulers:DatabaseScheduler'

Django应用程序启动后,它会使用IntervalSchedule自动创建几个调度程序,例如internet_status_check,system_resource_check等。

起初,它运行得很顺利,但是一旦我创建任何新的调度程序(无论是 IntervalSchedule 还是 CrontabSchedule),之前运行的调度程序就会停止执行。我在 celerybeat 终端中收到一条消息,还显示 DatabaseScheduler:计划已更改。

在此消息之后,即使可以从 Django 管理面板中看到任务可供执行,它也不会发送任何要执行的任务。

我尝试将代理更改为 RabbitMQ,将 result_backend 更改为 Redis/django-db。但同样的问题仍然存在。 即使我重新启动我的芹菜节拍,它也不会选择任何任务。

唯一有效的是将所有任务的last_run_at更改为None,然后在运行时使用django shell调用

changed()
方法。但这不是解决方案。

from django_celery_beat.models import PeriodicTask, PeriodicTasks

PeriodicTask.objects.all().update(last_run_at=None)
for task in PeriodicTask.objects.all():
    PeriodicTasks.changed(task)

如何解决这个问题?我这边是否缺少任何配置,或者这是 celery 节拍调度程序本身的错误?

django redis celery scheduler celerybeat
1个回答
0
投票

这是我第一次使用beat时发生的事情,这使得它变得更加复杂,因为它不提供任何错误或日志来检查丢失的内容。

我想你已经先配置好你的rabbitmq和redis了。例如设置主机、v_host、用户、密码等。我没有看到 CELERY_BROKER_URLCELERY_RESULT_BACKEND 所以我想它们在您的 settings.py

现在,为了确保您的节拍与 celery 工作人员一起运行,您可以在另一个终端中使用此指令:

celery -A proj worker --loglevel=info -B

但是,您可以尝试使用

celery -A proj purge
删除所有待处理任务或截断表 django_celery_beat_periodictaskdjango_celery_beat_periodictasks 后运行它。

考虑到它的配置可能很广泛,使用 docker 可能会很有用。请查看这篇文章逐步解释它,以便您可以比较实施中缺少的配置。

© www.soinside.com 2019 - 2024. All rights reserved.