芹菜定期任务不是定期的

时间:2019-06-04 20:07:29

标签: python redis celery

我尝试创建一个任务,该任务应与Redis服务器一起在芹菜中每分钟运行一次

要执行redis,我运行了"redis-server"

要执行芹菜,我跑了"celery -A tasks worker --loglevel=info"

这是我的task.py文件

from celery import Celery
from celery.schedules import crontab
from celery.task import periodic_task

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')


@app.task
def add(x, y):
    return x + y

@periodic_task(run_every=(crontab(minute='1')),name="run_every_minute",ignore_result=True)
def run_every_minute():
    print("hehe")
    return "ok"

当我在python控制台中运行时

from tasks.py import run_every_minute
z=run_every_minute.delay()

我在celery运行终端上的输出为

[2019-06-05 01:35:02,591: INFO/MainProcess] Received task: run_every_minute[06498b4b-1d13-45af-b91c-fb10476e0aa3]
[2019-06-05 01:35:02,595: WARNING/Worker-2] hehe 
[2019-06-05 01:35:02,599: INFO/MainProcess] Task run_every_minute[06498b4b-1d13-45af-b91c-fb10476e0aa3] succeeded in
    0.004713802001788281s: 'ok'

但这应该自执行定期任务以来每分钟执行一次。这怎么可能发生。 另外,如何在某个特定时间(例如格林尼治标准时间5:30)执行芹菜任务。

2 个答案:

答案 0 :(得分:1)

回答您的最后一条评论:

run_every=(crontab(minute='1'))

您已将“小时的分钟数”指定为1,因此,芹菜节拍每小时都会在分钟的“ 1”处执行定期任务,例如00:01、01:01等等。

您应该为crontab设置hour属性,最好设置为范围

答案 1 :(得分:1)

好的,根据评论

首先periodic_task需要启动调度程序/心跳(Periodic Tasks),调度程序将根据run_every参数发送任务

celery -A tasks beat

接下来,如果您需要每分钟发送一次节拍,则需要crontab像这样

@periodic_task(run_every=(crontab(minute='*')),name="run_every_minute",ignore_result=True)
def run_every_minute():
    print("hehe")
    return "ok"

使用minute='*'将每分钟发送一次任务。 minute=1将在每分钟的第一个小时发送任务