2012-07-26 32 views
30

Tôi có một nhiệm vụ trong Celery có khả năng chạy trong 10.000 giây trong khi hoạt động bình thường. Tuy nhiên, tất cả các nhiệm vụ còn lại của tôi sẽ được thực hiện trong chưa đầy một giây. Làm thế nào tôi có thể đặt giới hạn thời gian cho tác vụ cố ý chạy dài mà không thay đổi giới hạn thời gian đối với các tác vụ chạy ngắn?Đặt giới hạn thời gian cho một nhiệm vụ cụ thể với cần tây

Trả lời

44

Bạn có thể đặt giới hạn thời gian tác vụ (hard và/hoặc soft) trong khi xác định tác vụ hoặc trong khi gọi.

from celery.exceptions import SoftTimeLimitExceeded 

@celery.task(time_limit=20) 
def mytask(): 
    try: 
     return do_work() 
    except SoftTimeLimitExceeded: 
     cleanup_in_a_hurry() 

hoặc

mytask.apply_async(args=[], kwargs={}, time_limit=30, soft_time_limit=10) 
+0

lưu ý rằng các đối số timeout/soft_timeout để apply_async chỉ có sẵn trong phiên bản phát triển của cần tây (nhánh chính, phiên bản tương lai 3.1) – asksol

+10

Bạn cũng có thể đặt giới hạn thời gian cho một nhiệm vụ trong cấu hình bằng cách sử dụng: 'CELERY_ANNOTATIONS = {'module.mytask': {'time_limit': 20.0}}' – asksol

+6

Đối với phiên bản cần tây 3.1.x, có vẻ như các đối số 'timeout/soft_timeout' thành' apply_async' cũng đã được đã thay đổi thành 'time_limit/soft_time_limit'. Thay đổi có liên quan đã được giới thiệu tại đây - https://github.com/celery/celery/commit/be6cef2e441e5ecf5857aeb77bd885f06128b9c9 – sanchitarora

5

Đây là một ví dụ với trang trí cho một công tác cụ thể và cần tây 3.1.23 sử dụng soft_time_limit = 10000

@task(bind=True, default_retry_delay=30, max_retries=3, soft_time_limit=10000) 
def process_task(self, task_instance): 
    """Task processing.""" 
     pass 
+0

Bạn cũng có thể gán 'time_limit' với nhau như' @task (soft_time_limit = 10, time_limit = 15) ' –

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