2012-08-15 30 views
6

Có cách nào để cho biết cần thiết thay đổi cài đặt cho một tác vụ cụ thể trong khi đang chạy không?Tự động thay đổi cài đặt Beat Celery

Tiện ích này được minh họa tốt nhất trong ví dụ này:

Tôi có nhiệm vụ định kỳ kiểm tra giá trị sau mỗi 30 giây. Đôi khi, dựa trên một kích hoạt bên ngoài (mà tôi không thể dự đoán) tôi sẽ muốn công việc này để tăng tần số bỏ phiếu đến 10s - trong một vài phút.

Điều này có thể thực hiện được theo cách dễ quản lý không? Tôi biết tôi có thể thay đổi cấu hình nhiệm vụ và tải lại cần tây nhưng điều đó dường như là một cách lộn xộn để làm những việc ...

+0

Bạn đã tìm được cách? –

+1

@ CésarBustíos không thực sự. Kết thúc việc xây dựng một lịch trình trong nhà trên đầu trang của cần tây. Tôi nghĩ đó là phần lớn trong việc sử dụng thư viện. – Goro

Trả lời

3

Trên mô-đun schedules.py bạn sẽ tìm thấy điều này:

class schedule(object): 

    def is_due(self, last_run_at): 
     """Returns tuple of two items `(is_due, next_time_to_run)`, 
     where next time to run is in seconds. 

     e.g. 

     * `(True, 20)`, means the task should be run now, and the next 
      time to run is in 20 seconds. 

     * `(False, 12)`, means the task should be run in 12 seconds. 

     You can override this to decide the interval at runtime, 
     but keep in mind the value of :setting:`CELERYBEAT_MAX_LOOP_INTERVAL`, 
     which decides the maximum number of seconds celerybeat can sleep 
     between re-checking the periodic task intervals. So if you 
     dynamically change the next run at value, and the max interval is 
     set to 5 minutes, it will take 5 minutes for the change to take 
     effect, so you may consider lowering the value of 
     :setting:`CELERYBEAT_MAX_LOOP_INTERVAL` if responsiveness is of 
     importance to you. 

     .. admonition:: Scheduler max interval variance 

     The default max loop interval may vary for different schedulers. 
     For the default scheduler the value is 5 minutes, but for e.g. 
     the django-celery database scheduler the value is 5 seconds. 

     """ 
     last_run_at = self.maybe_make_aware(last_run_at) 
     rem_delta = self.remaining_estimate(last_run_at) 
     rem = timedelta_seconds(rem_delta) 
     if rem == 0: 
      return True, self.seconds 
     return False, rem 

Vì vậy, bạn có thể ghi đè phương thức is_due để đặt timedelta của riêng bạn.

+0

gặp sự cố với vấn đề này. khi tôi trở lại (True, 10) nó chỉ giữ lại chạy nhiệm vụ trong ít hơn một giây. cảm thấy như một vấn đề về datetime – dtc

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