为什么芹菜节拍不安排定期任务?

2024-04-23 18:35:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经按照芹菜文档https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html创建了一个应用程序和定期任务,如下所示:

$ tree demo/
demo/
├── config.py
├── __init__.py
└── tasks.py

$ cat demo/__init__.py 
# -*- coding: utf-8 -*-
from celery import Celery

app = Celery('demo')
app.config_from_object('demo.config')

$ cat demo/config.py 
# -*- coding: utf-8 -*-
BROKER_URL = "redis://127.0.0.1:6379"
CELERY_TIMEZONE='UTC'
CELERY_IMPORTS = [
    "demo.tasks",
]

$ cat demo/tasks.py 
from demo import app
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(3.0, say.s(), name='say hello every 3s')

@app.task
def say():
    print("Hello!")

然后用芹菜搅拌如下:

$ celery beat -A demo -l info --max-interval 10
celery beat v4.3.0 (rhubarb) is starting.
__    -    ... __   -        _
LocalTime -> 2019-12-12 16:26:41
Configuration ->
    . broker -> redis://127.0.0.1:6379//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> 10.00 seconds (10.0s)
[2019-12-12 16:26:41,234: INFO/MainProcess] beat: Starting...

请稍候,没有安排任何任务。你知道吗

但是,如果我在config中更改为setCELERYBEAT_SCHEDULE,它可以很好地工作。我这样做是通过改变demo/config.pydemo/tasks.py如下:

$ cat demo/config.py 
# -*- coding: utf-8 -*-

from datetime import timedelta

BROKER_URL = "redis://127.0.0.1:6379"

CELERY_TIMEZONE='UTC'
CELERY_IMPORTS = [
    "demo.tasks",
]

CELERYBEAT_SCHEDULE = {
    'say hello every 10 seconds': {
         'task': 'demo.tasks.say',
         'schedule': timedelta(seconds=3),
    },
}
$ cat demo/tasks.py 
from demo import app

@app.task
def say():
    print("Hello!")

然后用与之前相同的命令运行celery beat,周期性任务可以按预期每3秒安排一次。你知道吗

我以前的设置有什么问题?你知道吗


Tags: frompyimportconfigapptaskdemocat
3条回答

仅供参考,我找到了另一个解决方案,将装饰器@app.on_after_configure.connect更改为@app.on_after_finalize.connect可以使其工作。虽然我现在不知道确切的原因。你知道吗

必须根据this userguide scheduler键指定计划程序。例如,您可以尝试以下代码:

celery beat -A demo -l info  scheduler django_celery_beat.schedulers:DatabaseScheduler

另外,我不确定 max-interval是否会影响你的日程安排。我认为最好去掉这个选项。伊莫。你知道吗

芹菜4.x不使用大写配置变量-请参阅芹菜文档的New lowercase settings部分。特定于调度程序的配置参数在here中列出。因此,请尝试修改代码,使其具有beat_schedule = {而不是CELERYBEAT_SCHEDULE = {。你说你关注的链接也使用小写名称。。。你知道吗

相关问题 更多 >