芹菜周期性任务时区

时间:2014-04-28 15:03:33

标签: python celery

我有一些周期性任务需要在每个月的第一天午夜运行,但需要在客户的特定时区运行。我试图将所有内容保留在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
                   )

2 个答案:

答案 0 :(得分:2)

crontab()函数仅接受minutehourday_of_weekday_of_monthday_of_yearmonth_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参数

Celery beat - different time zone per task