2016-05-18 20 views
15

Vì trạng thái Celery documentation, tác vụ đã thực hiện sẽ không bị hủy bỏ bằng cách gọi .revoke(), trừ khi terminate=True được đặt. Nhưng điều đó không được khuyến khích, bởi vì nó sẽ tự giết chính nhân viên, điều này có thể đã bắt đầu một nhiệm vụ khác. Điều đó có nghĩa là không có cách nào đáng tin cậy, ổn định để làm điều đó?Có cách nào để ngăn chặn phi công việc đặc biệt của công nhân cần tây không?

EDIT: celery.contrib.abortable không phù hợp với tôi, bởi vì, như trạng thái tài liệu, nó chỉ hoạt động với các phần phụ trợ cơ sở dữ liệu.

+0

Tùy thuộc vào tác vụ bạn đang cố gắng chấm dứt (mạng, tệp, hoạt động cơ sở dữ liệu, v.v.), vui lòng xem ví dụ sau: http://stackoverflow.com/questions/37039941/celery- python-revoke Trong trường hợp của tôi nhiệm vụ chính của tôi gọi các tiến trình con không bị chấm dứt trừ khi tôi gửi một tín hiệu SIGKILL. – spicyramen

+0

Có thể trùng lặp của [Dừng nhiệm vụ cần tây duyên dáng] (http://stackoverflow.com/questions/16493364/stopping-celery-task-gracefully) – Louis

Trả lời

2

Tác vụ đang chạy là tiến trình con đang chạy của nhân viên (khi sử dụng prefork), điều này có nghĩa là cách duy nhất để hủy bỏ một nhiệm vụ là tiêu diệt tiến trình con đang chạy nó.

Bạn có thể thử thực hiện việc xử lý sự kiện thu hồi của riêng mình để tìm ra ID tiến trình con và chỉ xóa ID đó, nhưng thành thật không biết liệu có đáng giá hay không và liệu nó có thực sự hoạt động hay không.

Tôi nghĩ câu trả lời ngắn gọn là bạn không thể.

Dù sao giết người lao động là cần thiết đôi khi, đặc biệt là trong giai đoạn đầu của dự án mà bạn vẫn cần phải kích thước một cách chính xác các nguồn lực, chỉ cần đảm bảo bạn đăng nhập ở đâu đó những nhiệm vụ đang chạy, do đó bạn có thể sắp xếp lại chúng hoặc chỉ sử dụng CELERY_ACKS_LATE

+0

"Dù sao giết người công nhân không phải là bất thường" Điều gì * bình thường * điều kiện sẽ bảo đảm buộc phải chấm dứt của một công nhân trên một hệ thống sản xuất? Tôi đã sử dụng Celery trong một vài năm nay và thời gian * * duy nhất mà một công nhân bị buộc phải chấm dứt là khi trang web phải được đóng cửa để bảo trì. – Louis

+1

Tùy thuộc vào trường hợp sử dụng, tôi làm việc cho một trang web cộng đồng lớn trở lại trong những ngày và chúng tôi gặp một số vấn đề trong thời gian cao điểm. Công nhân đã chiếm nhiều bộ nhớ và đóng băng. Tất nhiên điều này là do thực tế là chúng tôi đã không mong đợi rằng tải và công nhân mà không kích thước chính xác. Nhưng tôi có thể nói với bạn rằng trong một năm đã xảy ra vài lần, mà không xem xét tổng số vụ va chạm của máy do các yếu tố khác. –

+0

Tôi làm rõ bằng câu trả lời sau khi Louis bình luận. –

1

Bạn có thể gửi tín hiệu HUP thay vì TERM để khởi động lại quy trình con một cách duyên dáng mà không giết người lao động.

In [80]: import signal 

In [81]: x = add.delay(1, 2) 

In [82]: x.revoke(terminate=True, signal=signal.SIGHUP) 
+0

"Khác với việc dừng sau đó bắt đầu công nhân khởi động lại, bạn cũng có thể khởi động lại nhân viên bằng tín hiệu HUP, nhưng lưu ý rằng nhân viên sẽ chịu trách nhiệm tự khởi động lại để điều này dễ xảy ra và không được khuyến nghị trong sản xuất" [Nguồn] (http://docs.celeryproject.org/en/latest/userguide/workers.html) – Louis

+0

@Louis Nếu bạn có một nhân viên có đồng thời 4, nó có 4 tiến trình chạy 4 tác vụ cùng một lúc. Bây giờ khởi động lại nó là một ý tưởng tồi để hủy bỏ một nhiệm vụ, vì nó có thể làm gián đoạn quá trình khác. Lệnh trên sẽ chỉ khởi động lại một tiến trình đang chạy tác vụ đó. – ChillarAnand

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