我想使用django_rq
和rq-scheduler
進行離線任務,但我不確定在哪裏調用rq-scheduler
的計劃重複任務的能力。現在,我已將我的日程安排添加到我的應用中的tasks.py
模塊,並將其導入到__init__
.py中。但是,必須有更好的方式來做到這一點,對嗎?我在哪裏可以在Django應用程序中註冊rq-scheduler作業?
在此先感謝。
我想使用django_rq
和rq-scheduler
進行離線任務,但我不確定在哪裏調用rq-scheduler
的計劃重複任務的能力。現在,我已將我的日程安排添加到我的應用中的tasks.py
模塊,並將其導入到__init__
.py中。但是,必須有更好的方式來做到這一點,對嗎?我在哪裏可以在Django應用程序中註冊rq-scheduler作業?
在此先感謝。
我已經在我的一個項目應用程序(根據Django)中添加了調度到__init__
模塊,但是包含了防止排隊作業兩次或多次的小函數。調度策略可能取決於您的特定需求(即您可能需要額外檢查工作參數)。這對我的作品和適合我的需要
代碼:
import django_rq
from collections import defaultdict
import tasks
scheduler = django_rq.get_scheduler('default')
jobs = scheduler.get_jobs()
functions = defaultdict(lambda: list())
map(lambda x: functions[x.func].append(x.meta.get('interval')), jobs)
now = datetime.datetime.now()
def schedule_once(func, interval):
"""
Schedule job once or reschedule when interval changes
"""
if not func in functions or not interval in functions[func]\
or len(functions[func])>1:
# clear all scheduled jobs for this function
map(scheduler.cancel, filter(lambda x: x.func==func, jobs))
# schedule with new interval
scheduler.schedule(now+datetime.timedelta(seconds=interval), func,
interval=interval)
schedule_once(tasks.some_task_a, interval=60*5)
schedule_once(tasks.some_task_b, interval=120)
而且我裹這個片段,以避免在封裝級進口:
def init_scheduler():
# paste here initialization code
init_scheduler()
我剛剛遇到了'在settings.py中調度'的地獄。顯然,每次導入時,它都會重新添加預定作業。我有一次每小時應該開火一次的工作,一次堆放在隊列50中......;) –
我發現的最好的地方運行它是從AppConfig
在apps.py
。
def ready(self):
scheduler = django_rq.get_scheduler('default')
# Delete any existing jobs in the scheduler when the app starts up
for job in scheduler.get_jobs():
job.delete()
# Have 'mytask' run every 5 minutes
scheduler.schedule(datetime.utcnow(), 'mytask', interval=60*5)
你能修改格式嗎? thnx – FeedTheWeb
django rq如何檢測此調度程序?是否需要通過調用函數從某個代碼啓動它?或者如果不是,我怎麼能啓動它自動運行python manage.py rqscheduler? –
在較新版本的Django中,您可以創建一個用於配置應用程序的apps.py文件。請參閱此處獲取最新信息:https://docs.djangoproject.com/en/1.9/ref/applications/ –
我創建了修改和替換包括在django_rq
的rqscheduler
命令自定義管理命令。這裏提供了一個例子:https://github.com/rq/rq-scheduler/issues/51#issuecomment-362352497
我想 - 無處。每次重新啓動應用程序服務器時,作業都將被添加到調度程序隊列中(任務在每次啓動時都會相乘)。作爲解決方法,您可以在每次啓動時清除/刪除'rq:scheduler:scheduled_jobs'鍵,然後再添加它們。但請記住,要避免在工作流程中添加/刪除作業 - 我不知道如何實現這一點。 – marcinn