Celery的过期选项不起作用

时间:2016-01-14 22:22:36

标签: python celery

我正在玩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}}

我做错了吗?

1 个答案:

答案 0 :(得分:1)

我认为您对expires参数的理解是错误的。

文档说:“到期后将不执行任务。” ref。这意味着如果超过了到期时间,执行将不会开始。如果执行已经开始,执行将完成。

您的配置每5秒将一个任务添加到任务队列中。如果从将任务添加到任务队列后的10秒内执行仍未开始,则将丢弃该任务。但是,由于有免费的芹菜工人可用,因此任务会立即执行。

您的代码示例添加了一个任务,如果在5秒钟内未开始执行,则该任务将被丢弃。

要获得所需的功能,可以将'expires': 10,替换为'expires': datetime.datetime.now() + timedelta(seconds=10),。这样会将expires设置为绝对时间。