我尝试创建一个任务,该任务应与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)执行芹菜任务。
答案 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
将在每分钟的第一个小时发送任务