2013-07-08 22 views
8

Tôi muốn sử dụng django_rqrq-scheduler cho các tác vụ ngoại tuyến, nhưng tôi không chắc chắn về khả năng lập lịch nhiệm vụ lặp lại của rq-scheduler. Ngay bây giờ, tôi đã thêm lịch biểu của mình vào mô-đun tasks.py trong ứng dụng của mình và nhập vào trong __init__ .py. Tuy nhiên, phải có cách tốt hơn để làm điều này, đúng không?Tôi đăng ký công việc lên lịch rq trong ứng dụng Django ở đâu?

Xin cảm ơn trước.

+0

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

Trả lời

9

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() 
+3

Tôi chỉ chạy vào địa ngục đó là 'lập lịch trong settings.py'. Rõ ràng mỗi khi nó được nhập khẩu, nó lại thêm các công việc theo lịch trình. Tôi có công việc được cho là sẽ cháy một lần mỗi giờ xếp hàng trong hàng đợi 50 tại một thời điểm ....;) –

8

Nơi tốt nhất tôi đã tìm thấy để chạy nó từ số AppConfig của bạn trong 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) 
+1

bạn có thể sửa chữa định dạng không? thnx – FeedTheWeb

+1

Cách django rq sẽ phát hiện trình lên lịch này? là nó cần thiết để bắt đầu nó từ một nơi nào đó mã bằng cách gọi chức năng? hoặc nếu không làm thế nào tôi có thể bắt đầu nó tự động trên chạy python manage.py rqscheduler? –

+0

Trong các phiên bản mới hơn của Django, bạn có thể tạo tệp apps.py được sử dụng để định cấu hình ứng dụng của bạn. Xem ở đây để biết thông tin mới nhất: https://docs.djangoproject.com/en/1.9/ref/applications/ –

Các vấn đề liên quan