Tôi đã thêm lịch biểu vào mô-đun __init__
trong một trong các ứng dụng dự án của tôi (về Django), nhưng được bao bọc với chức năng nhỏ ngăn cản việc xếp hàng hai lần trở lên. Chiến lược lập lịch có thể phụ thuộc vào các nhu cầu cụ thể của bạn (nghĩa là bạn có thể cần kiểm tra bổ sung đối số công việc).
Mã làm việc cho tôi và phù hợp với nhu cầu của tôi:
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)
Ngoài ra tôi đã quấn đoạn này để tránh nhập khẩu ở mức gói:
def init_scheduler():
# paste here initialization code
init_scheduler()
Tôi nghĩ - không nơi nào. Mỗi khi bạn khởi động lại máy chủ ứng dụng, công việc sẽ được thêm vào hàng đợi lên lịch (nhiệm vụ sẽ được nhân lên trên mỗi lần khởi động). Như cách giải quyết khác, bạn có thể xóa/xóa khoá 'rq: scheduler: scheduled_jobs' trên mỗi lần khởi động, ngay trước khi thêm chúng. Nhưng hãy nhớ tránh thêm/xóa các công việc trong các quy trình công nhân - Tôi không biết làm thế nào để đạt được điều đó. – marcinn