Chúng tôi sử dụng Celery với ứng dụng web Django của chúng tôi để quản lý các tác vụ ngoại tuyến; một số tác vụ này có thể chạy tới 120 giây.Cách khởi động lại Celery một cách duyên dáng mà không làm chậm công việc
Bất cứ khi nào chúng tôi thực hiện bất kỳ sửa đổi mã nào, chúng tôi cần phải khởi động lại Celery để yêu cầu tải lại mã Python mới. Giải pháp hiện tại của chúng tôi là gửi một SIGTERM đến quy trình Celery chính (kill -s 15 `cat /var/run/celeryd.pid`
), sau đó đợi nó chết và khởi động lại nó (python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
).
Do nhiệm vụ dài hạn, điều này thường có nghĩa là việc tắt máy sẽ mất một hoặc hai phút, trong đó không có nhiệm vụ mới nào được xử lý, gây ra sự chậm trễ đáng chú ý cho người dùng hiện tại trên trang web. Tôi đang tìm cách bảo Celery tắt máy, nhưng sau đó ngay lập tức khởi chạy một thể hiện Celery mới để bắt đầu chạy các nhiệm vụ mới.
Những điều mà không công việc:
- Gửi SIGHUP đến quá trình chính: điều này gây ra cần tây để cố gắng "khởi động lại", bằng cách thực hiện một shutdown ấm và sau đó việc tái giới thiệu bản thân. Điều này không chỉ mất một thời gian dài, nó thậm chí không hoạt động, bởi vì dường như quá trình mới ra mắt trước khi cái cũ chết, vì vậy cái mới than phiền
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
và chết ngay lập tức. (Điều này giống như một lỗi trong chính Celery; tôi đã let them know về nó.) - Gửi SIGTERM đến quy trình chính và sau đó ngay lập tức khởi chạy một cá thể mới: cùng một vấn đề với Pidfile.
- Vô hiệu hóa Pidfile hoàn toàn: không có nó, chúng tôi không có cách nào để nói quá trình Celery nào là quá trình chính cần gửi SIGTERM khi chúng ta muốn tắt máy. Chúng tôi cũng không có cách nào đáng tin cậy để kiểm tra xem quy trình chính vẫn còn sống hay không.
Có lẽ câu trả lời của tôi về http://stackoverflow.com/questions/9764913/how-do-i-restart-celery-workers-gracefully/16717128#16717128 sẽ giúp bạn. – guettli