2013-06-13 22 views
9

Làm thế nào trưởng thành là Chronos? Nó có phải là một sự thay thế khả thi để lên lịch như cần tây-đánh bại?Thay thế Celerybeat bằng Chronos

Ngay bây giờ, lịch biểu của chúng tôi thực hiện nhiệm vụ "nhịp tim" định kỳ kiểm tra các sự kiện "nổi bật" và kích hoạt chúng nếu chúng quá hạn. Chúng tôi đang sử dụng quy tắc của python-dateutil để xác định điều này.

Chúng tôi đang xem xét các giải pháp thay thế cho cách tiếp cận này và Chronos có vẻ là một lựa chọn rất hấp dẫn: 1) nó sẽ giảm thiểu sự cần thiết phải sử dụng nhiệm vụ lịch nhịp tim, 2) nó hỗ trợ gửi các sự kiện RESTful với định dạng ISO8601, 3) một giao diện hữu ích cho quản lý, và 4) nó cân.

Yêu cầu quan trọng là lập lịch cần phải được định cấu hình khi đang di chuyển từ Giao diện web. Đây là lý do tại sao không thể sử dụng lịch trình tích hợp sẵn của celerybeat trong hộp.


Chúng ta sẽ tự bắn mình bằng cách chuyển sang Chronos?

+0

Bạn đã bao giờ tự trả lời câu hỏi này chưa? – crowder

+0

@crowder: Không. Nó khá phức tạp để triển khai, và dường như nó không được chấp nhận rộng rãi. – Goro

+0

Vì vậy, những gì bạn đã cobbled với nhau để lập kế hoạch/cử cho cần tây? Chỉ cần sử dụng cần tây đánh bại, trên một nút, với ngón tay của bạn vượt qua? – crowder

Trả lời

0

This SO có giải pháp cho vấn đề tác vụ định kỳ động của bạn. Hiện tại, đó không phải là câu trả lời được chấp nhận:

from djcelery.models import PeriodicTask, IntervalSchedule 
from datetime import datetime 

class TaskScheduler(models.Model): 

    periodic_task = models.ForeignKey(PeriodicTask) 

    @staticmethod 
    def schedule_every(task_name, period, every, args=None, kwargs=None): 
    """ schedules a task by name every "every" "period". So an example call would be: 
      TaskScheduler('mycustomtask', 'seconds', 30, [1,2,3]) 
      that would schedule your custom task to run every 30 seconds with the arguments 1 ,2 and 3 passed to the actual task. 
    """ 
     permissible_periods = ['days', 'hours', 'minutes', 'seconds'] 
     if period not in permissible_periods: 
      raise Exception('Invalid period specified') 
     # create the periodic task and the interval 
     ptask_name = "%s_%s" % (task_name, datetime.datetime.now()) # create some name for the period task 
     interval_schedules = IntervalSchedule.objects.filter(period=period, every=every) 
     if interval_schedules: # just check if interval schedules exist like that already and reuse em 
      interval_schedule = interval_schedules[0] 
     else: # create a brand new interval schedule 
      interval_schedule = IntervalSchedule() 
      interval_schedule.every = every # should check to make sure this is a positive int 
      interval_schedule.period = period 
      interval_schedule.save() 
     ptask = PeriodicTask(name=ptask_name, task=task_name, interval=interval_schedule) 
     if args: 
      ptask.args = args 
     if kwargs: 
      ptask.kwargs = kwargs 
     ptask.save() 
     return TaskScheduler.objects.create(periodic_task=ptask) 

    def stop(self): 
     """pauses the task""" 
     ptask = self.periodic_task 
     ptask.enabled = False 
     ptask.save() 

    def start(self): 
     """starts the task""" 
     ptask = self.periodic_task 
     ptask.enabled = True 
     ptask.save() 

    def terminate(self): 
     self.stop() 
     ptask = self.periodic_task 
     self.delete() 
     ptask.delete() 

Tôi chưa sử dụng djcelery, nhưng được cho là có giao diện quản trị cho các tác vụ định kỳ động.