2014-02-17 30 views
1

我正在使用芹菜節拍安排一些任務。我可以使用CELERY_TIMEZONE設置來使用crontab日程安排任務,並且它在所提到的時區中的預定時間運行。芹菜節拍 - 每項任務不同時區

但我希望能夠在同一個應用程序中爲不同的時區設置多個這樣的任務(單個django settings.py)。我知道在計劃任務時哪個任務需要在什麼時區運行。

是否有可能爲每個任務指定不同的時區?

我使用django(1.4)與芹菜(3.0.11)和django芹菜(3.0.11)。

我看過djcelery.schedulers.DatabaseScheduler類,它是基類,但我不知道如何以及在哪裏使用時區。我可以編寫一個可以讓每個作業在不同時區運行的自定義調度程序嗎?

感謝,

回答

1

我認爲這樣做是使用裝飾與mock

from mock import patch 

@task 
@patch.multiple(settings, CELERY_TIMEZONE='time_zone') 
def my_task(*args): 
    #do your staff 

我沒有測試但最簡單的方法,但它似乎是正確的。我希望我幫你:)

+0

感謝您的建議。讓我嘗試一下。我在想這樣的事情是需要的,但沒有意識到模擬。 – ksrini

+0

現在想想看,當節拍開始時,需要修補時區,而不是當任務執行時我會想。我要去測試一下。 – ksrini

+0

我有類似的情況,你有什麼別的嗎? – reptilicus

0

也許我誤解了這個問題,但是如果你想在不同時區的特定時間運行任務,你能不能通過時間差來抵消預定的時間區?例如,如果我想要一個任務,在兩個不同的TZS於下午5點運行:

# settings.py 
CELERY_TIMEZONE = "US/Eastern" 

CELERYBEAT_SCHEDULE = { 
    # Task to run in EST 
    'schedule-my-est-task': { 
     'task': 'path.to.my.est.task', 
     'schedule': crontab(minute=0, hour=17), 
    }, 
    # Task to run in UTC - hour time is offset 
    'schedule-my-utc-task': { 
     'task': 'path.to.my.utc.task', 
     'schedule': crontab(minute=0, hour=10), 
    }, 
} 
+1

其實這正是我想要避免的。目前這是正在做的事情。但每當有日光設置改變時,有人需要改變時間表。用戶將使用類似界面的管理控制檯添加時間表,並將指定一個時區(實際上是一個位置,我可以找出時區)。我希望用戶爲時區設置時間表並忘記它,而不必擔心在日光設置更改時更改時間表。 – ksrini

+0

這是有道理的,並使原來的問題更加困難。所以你希望這個任務能夠根據某個人的時區在特定的時間運行,以便他們可以在任何時區同時更改時區並同時獲取它。也許您可以每小時運行一次計劃任務,並且每小時檢查一次您希望運行任務的時間區域中的用戶。那麼你只能爲相關用戶從該計劃任務中觸發原始任務? –

7

您可以在芹菜時間表實現的個體任務的時區感知的調度。這樣,您就可以根據特定的時區的本地時間運行任務由(也調整到如夏令時間)指定一個獨立的,現在的作用每個芹菜時間表

crontab支持nowfun argument指定日期時間函數被用來檢查它是否應該通過運行

import datetime 
import pytz 
nowfun = lambda: datetime.datetime.now(pytz.timezone('Europe/Berlin')) 

在您的日程安排,設置此功能的日期時間函數

'periodic_task': { 
    'task': 'api.tasks.periodic', 
    'schedule': crontab(hour=6, minute=30, nowfun=nowfun) 
} 

這運行每天上午6點30分CET調整爲夏令時。

如果您使用的功能不止一次,考慮創建一個輔助

from functools import partial 
cet_crontab = partial(crontab, nowfun=nowfun) 
'periodic_task': { 
    'task': 'api.tasks.periodic', 
    'schedule': cet_crontab(hour=6, minute=30) 
} 

請確保您有CELERY_ENABLE_UTC = False集,否則你的芹菜時間表轉換爲UTC。