我有一些周期性任务需要在每个月的第一天午夜运行,但需要在客户的特定时区运行。我试图将所有内容保留在UTC中,所以我有
CELERY_ENABLE_UTC = True
因此,如果我有多个任务,每个任务都需要在特定时区的午夜运行,那么使用Celery最简单的方法是什么?例如,在各自的时区午夜运行这两项任务?
#for Client 1, this needs to run at Midnight EST (US/Eastern)
schedule1 = crontab(day_of_month=1,
hour = 0,
minute = 0
)
#for Client 2, this needs to run at Midnight PST (US/Pacific)
schedule1 = crontab(day_of_month=1,
hour = 0,
minute = 0
)
答案 0 :(得分:2)
crontab()
函数仅接受minute
,hour
,day_of_week
,day_of_month
,day_of_year
和month_of_year
作为参数。如果您想在午夜为不同的时区运行任务,您必须根据UTC(或Celery配置中设置的任何其他默认时区)计算它们的时间。
from datetime import datetime
from pytz import timezone
def get_utc_for_midnight_in_timezone(tzstring):
local_midnight = datetime(2000, 1, 1, 0, 0, 0, tzinfo=timezone(tzstring))
utc = local_midnight.astimezone(timezone('UTC'))
return {
'day_of_month': utc.day,
'hour': utc.hour,
'minute': utc.minute
}
您可以这样使用上述功能:
client1_schedule = crontab(**get_utc_for_midnight_in_timezone('US/Pacific'))
client2_schedule = crontab(**get_utc_for_midnight_in_timezone('US/Eastern'))
答案 1 :(得分:0)
尝试使用nowfun
对象的crontab
中的datetime
参数