2012-01-16 21 views
6

Về cơ bản tôi có rất nhiều nhiệm vụ (theo lô khoảng 1000) và thời gian thực hiện các tác vụ này có thể khác nhau nhiều (từ ít hơn từ thứ hai đến 10 phút). Tôi biết rằng nếu một nhiệm vụ được thực hiện nhiều hơn một phút tôi có thể giết nó. Các nhiệm vụ này là các bước tối ưu hóa một số mô hình khai phá dữ liệu (nhưng độc lập với nhau) và dành phần lớn thời gian bên trong một số hàm mở rộng C để chúng không hợp tác nếu tôi cố gắng giết chúng một cách duyên dáng.Có hàng đợi nhiệm vụ phân tán trong Python cho phép tôi hủy các tác vụ treo không sẵn sàng hợp tác

Có hàng đợi tác vụ được phân phối phù hợp với lược đồ đó --- AFAIK: cần tây cho phép hủy các tác vụ sẵn sàng hợp tác hay không. Nhưng tôi có thể sai.

Gần đây tôi đã hỏi câu hỏi tương tự về việc giết chết các chức năng treo trong python tinh khiết Kill hanging function in Python in multithreaded enviorment.

Tôi đoán tôi có thể phân lớp nhiệm vụ cần tây để nó sinh ra một quy trình mới và sau đó thực thi tải trọng của nó hủy bỏ việc thực hiện nếu cần, nhưng sau đó tôi sẽ bị giết bởi phí khởi tạo của trình thông dịch mới.

+0

Bạn đã xem ''IPython.parallel'' chưa? Nó hỗ trợ cân bằng tải và thời gian chờ. – Dietrich

Trả lời

6

Celery hỗ trợ time limiting. Bạn có thể sử dụng giới hạn thời gian để tiêu diệt các tác vụ chạy dài. Bên cạnh nhiệm vụ giết bạn có thể sử dụng giới hạn mềm cho phép xử lý SoftTimeLimitExceeded ngoại lệ trong các tác vụ và chấm dứt công việc một cách sạch sẽ.

from celery.task import task 
from celery.exceptions import SoftTimeLimitExceeded 

@task 
def mytask(): 
    try: 
     do_work() 
    except SoftTimeLimitExceeded: 
     clean_up_in_a_hurry() 
0

Pistil cho phép quản lý nhiều quy trình, bao gồm cả việc hủy các tác vụ không hợp tác.

Nhưng:

  • đó là phần mềm phiên bản beta, ngay cả khi nó quyền hạn gunicorn đó là đáng tin cậy
  • Tôi không biết nó như thế nào xử lý 1000 quá trình
  • Truyền thông giữa quá trình không được bao gồm, vì vậy bạn sẽ phải thiết lập của riêng bạn bằng cách sử dụng ví dụ zeromq

Một khả năng khác là sử dụng timer signal do đó, nó tăng ngoại lệ trong 36000 giây. Nhưng các tín hiệu không phải là trigered nếu ai đó có được GIL, mà bạn C chương trình có thể làm.

0

Khi bạn thu hồi tác vụ cần tây, bạn có thể cung cấp từ khóa tùy chọn terminate=True.

task.revoke(terminate=True) 

Nó không chính xác phù hợp với yêu cầu của bạn vì nó không được thực hiện theo quy trình riêng của mình, nhưng bạn sẽ có thể để hoặc mở rộng các lớp nhiệm vụ để có thể tự tử, hoặc có một nhiệm vụ dọn dẹp reccurring hoặc quá trình giết chết các nhiệm vụ chưa hoàn thành đúng thời hạn.

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