带倒计时的Celery任务

16 投票
2 回答
14130 浏览
提问于 2025-04-18 12:21

我正在使用Celery 2.5.1,想要用countdown这个功能让任务在20秒后执行,但它却立刻就执行了。

我这样使用它:

DemoTask.apply_async(countdown = 20)

我是不是漏掉了什么?

2 个回答

6

除了@Banana提到的时区问题之外,确保Celery的配置选项always_eager设置为False。如果这个选项不设置为False,Celery就会跳过倒计时预计时间(eta)。

17

这个问题可能是因为时区设置不对。你设置了 countdown=20,这可能是在告诉 Celery 在3小时前的20秒后执行任务。

我建议使用 pytz库 来告诉 Celery 在正确的时间开始任务:

from datetime import datetime, timedelta
from pytz import timezone

# Set timezone: http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
my_tz = timezone('US/Eastern')

DemoTask.apply_async(eta=my_tz.localize(datetime.now()) + timedelta(seconds=20))

如果你使用的是 Django(并且在 settings.py 中设置了 TIME_ZONE),那会更简单:

from datetime import timedelta
from django.utils.timezone import now

DemoTask.apply_async(eta=now() + timedelta(seconds=20))

撰写回答