带倒计时的Celery任务
我正在使用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))