我正在玩Celery,我正在尝试使用celery -A celery_app beat
执行定期任务。这是我的配置:
@app.task()
def print_hello():
while True:
print datetime.datetime.now()
sleep(1)
当使用print_hello.apply_async(args=[], expires=5)
运行节拍时,任务似乎没有过期。然后我读到节拍可能存在一些问题,所以它没有考虑到期限选项。
然后我尝试了一个任务,所以它会被手动调用。
Received task: tasks.print_hello[05ee0175-cf3a-492b-9601-1450eaaf8ef7] expires:[2016-01-15 00:08:03.707062+02:00]
我以这种方式调用任务:
{{1}}
工作人员的控制台告诉我我的任务将过期,但它也不会过期。它正在无限执行。
{{1}}
我做错了吗?
答案 0 :(得分:1)
我认为您对expires
参数的理解是错误的。
文档说:“到期后将不执行任务。” ref。这意味着如果超过了到期时间,执行将不会开始。如果执行已经开始,执行将完成。
您的配置每5秒将一个任务添加到任务队列中。如果从将任务添加到任务队列后的10秒内执行仍未开始,则将丢弃该任务。但是,由于有免费的芹菜工人可用,因此任务会立即执行。
您的代码示例添加了一个任务,如果在5秒钟内未开始执行,则该任务将被丢弃。
要获得所需的功能,可以将'expires': 10,
替换为'expires': datetime.datetime.now() + timedelta(seconds=10),
。这样会将expires
设置为绝对时间。