2013-01-21 26 views
6

Trong cần tây, có cách đơn giản để tạo một (các) nhiệm vụ mà tôi có thể sử dụng để tự động khởi động lại một nhân viên không?Nhiệm vụ của Python Celery để khởi động lại công nhân cần tây

Mục đích là để việc triển khai của tôi tự động khởi động lại tất cả các công nhân cần tây non mỗi khi nó nhận được nguồn mới từ github. Vì vậy, sau đó tôi có thể gửi tác vụ restartWorkers() cho trường hợp cần quản lý của mình trên máy sẽ giết (thực sự dừng) tất cả các quy trình công nhân cần tây trên máy đó và khởi động lại chúng bằng các mô-đun mới.

Kế hoạch này là dành cho mỗi máy phải có:

  • nút Quản lý [Queues: Quản lý, thiết bị riêng biệt] - Chịu trách nhiệm quản lý phần còn lại của những người lao động trên máy tính này, đưa lên các nút mới và giết cũ những người cần thiết
  • Nút công nhân [Hàng đợi: cụ thể, sửa đổi, cụ thể cho người lao động, máy cụ thể] - Thực sự chịu trách nhiệm thực hiện công việc.

Có vẻ như mã tôi cần ở đâu đó trong dist_packages/celery/bin/celeryd_multi.py, nhưng nguồn này khá mờ đục khi bắt đầu công nhân và tôi không biết nó hoạt động như thế nào thực sự bắt đầu các nút. (Dường như shutdown_nodes là mã chính xác để kêu gọi giết chết các quy trình, và tôi đang từ từ gỡ lỗi theo cách của mình thông qua nó để tìm ra lý lẽ của tôi nên là gì)

Có chức năng/chức năng restart_nodes (tự, nút) một nơi nào đó mà tôi có thể gọi hoặc tôi sẽ chạy các kịch bản shell từ bên trong python?

/Ngoài ra, có cách nào đơn giản hơn để tải lại nguồn vào Python hơn là giết và khởi động lại quy trình không? Nếu tôi biết rằng tải lại mô-đun thực sự làm việc (Thử nghiệm nói rằng nó không. Thay đổi chức năng không percolate cho đến khi tôi khởi động lại quá trình), tôi chỉ làm điều đó thay vì indirection với các nút quản lý.

EDIT: Tôi hiện có thể tắt máy, nhờ phát sóng (Cảm ơn mihael. Nếu tôi có thêm đại diện, tôi sẽ upvote). Bất kỳ cách nào để phát lại một khởi động lại? Có pool_restart, nhưng điều đó không giết nút, có nghĩa là nó sẽ không cập nhật nguồn.

Tôi đã xem xét một số nguồn hậu trường trong celery.bin.celeryd: WorkerCommand(). Run(), nhưng có một số công cụ kỳ lạ xảy ra trước và sau cuộc gọi chạy, vì vậy tôi có thể ' t chỉ cần gọi chức năng đó và được thực hiện bởi vì nó bị treo. Nó chỉ làm cho 0 ý nghĩa để gọi một lệnh shell từ một kịch bản python để chạy một kịch bản python, và tôi không thể tin rằng tôi là người đầu tiên muốn làm điều này.

+0

"Có pool_restart, nhưng điều đó không giết nút, có nghĩa là nó sẽ không cập nhật nguồn" - thực sự muốn bạn có một giải pháp cho điều này, nhưng có vẻ như nó vẫn chưa được giải quyết ở đây. – AlanSE

+0

cách bạn xử lý công nhân của mình? bạn đang sử dụng systemd? bạn có thể có một nhiệm vụ execRestart và gọi systemctl khởi động lại celery.service ví dụ vào cuối triển khai – shalbafzadeh

+0

Công ty đó đã đi dưới 4 năm trước, do đó, nó không quan trọng bây giờ và tôi quên. –

Trả lời

2

Bạn có thể thử sử dụng broadcast functionality của Cần tây.

đây bạn có thể thấy một số ví dụ điển hình: https://github.com/mher/flower/blob/master/flower/api/control.py

+0

Nửa đường ở đó. Tôi có thể tắt máy, nhưng tôi không thể chịu nổi. Cảm ơn. –

+0

Tin nhắn 'pool_restart' có thể thực hiện công việc không? Có lẽ nó sẽ không bắt kịp các nhiệm vụ mới, nhưng nó sẽ nắm bắt các bản cập nhật cho các lực lượng hiện có. Tôi không chắc chắn 100% khi Celery liên kết tên tác vụ mang tính biểu tượng với một số cuộc gọi cụ thể.Nếu nó xảy ra trong hồ bơi chính nó sau đó khởi động lại nó sẽ giải quyết bạn nhiệm vụ, như xa như tôi nhận được nó. –

+4

Không. Xác định một nhiệm vụ Thêm (x, y) trả về x + y. Bắt đầu cần tây. 'add.delay (4,4)' trả về 8. Chỉnh sửa thêm để trả về x * y. 'broadcast ('pool_restart')'. 'add.delay (4,4)' vẫn trả về 8 thay vì 16. Lưu ý rằng hành vi này cũng được quan sát trong cờ '--autoreload'. –

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