2014-04-28 3 views
2

매월 1 일 자정에 실행해야하는 정기적 인 작업이 있지만 클라이언트의 특정 시간대가 있습니다. 내가 UTC에 모든 것을 유지하기 위해 노력하고있어 그래서 나는 각각의 특정 시간대에 자정에 실행하는 데 필요한 여러 작업이 그렇다면셀러리 정기 작업 시간대

CELERY_ENABLE_UTC = True 

이, 셀러리와 함께이 작업을 수행하는 가장 깨끗한 방법은 무엇입니까 ? 예를 들어, 자정에이 두 작업을 해당 시간대별로 실행하십시오.

#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

crontab() 함수 파라미터로만 minute, hour, day_of_week, day_of_month, day_of_yearmonth_of_year을 받아 들인다. 다른 시간대에 자정에 작업을 실행하려면 UTC (또는 셀러리 설정에 설정된 다른 기본 시간대)에 따라 시간을 계산해야합니다.

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')) 
+0

그래이 내가 뭘하는지의 일종이다. 문제는 일광 절약 시간제가 바뀔 때마다 동기화되지 않는다는 것입니다. 1 시간 후에 꺼질거야. – reptilicus

+0

그래서'timezone.localize()'메서드를'is_dst' 인수와 함께 사용할 수 있습니다. 유일한 문제는 is_dst가 True 또는 False 인 날짜를 스스로 결정해야한다는 것입니다. – daniula

+0

예 나는 날짜가 dst인지 아닌지 알아낼 방법이 없습니다. 나는 매 시간마다 달리고 시간을 정하는 또 다른 샐러리 일을 할 것 같아. – reptilicus