Có một vấn đề mở trong cần tây github repo về điều này. Không biết nếu họ đang làm việc trên nó mặc dù.
Cách giải quyết khác là bạn có thể thêm khóa cho các tác vụ để chỉ có 1 phiên bản của PeriodicTask cụ thể sẽ chạy cùng một lúc.
Cái gì như:
if not cache.add('My-unique-lock-name', True, timeout=lock_timeout):
return
Tìm ra thời gian chờ khóa là tốt, khéo léo. Chúng tôi đang sử dụng nhiệm vụ 0,9 * run_every giây nếu các celerybeats khác nhau sẽ cố gắng chạy chúng vào các thời điểm khác nhau. 0,9 chỉ để lại một số lợi nhuận (ví dụ: khi cần tây hơi chậm so với lịch trình một lần, sau đó đúng tiến độ sẽ khiến khóa vẫn hoạt động).
Sau đó, bạn có thể sử dụng phiên bản celerybeat trên tất cả các máy. Mỗi nhiệm vụ sẽ được xếp hàng đợi cho mọi trường hợp celerybeat nhưng chỉ một nhiệm vụ của chúng sẽ kết thúc chạy.
Công việc vẫn sẽ tôn trọng run_every theo cách này - trường hợp xấu nhất: nhiệm vụ sẽ chạy ở tốc độ 0.9 * run_every.
Một vấn đề với trường hợp này: nếu nhiệm vụ được xếp hàng nhưng không được xử lý theo thời gian đã lên lịch (ví dụ vì bộ xử lý hàng đợi không khả dụng) - thì khóa có thể được đặt sai thời gian khiến 1 nhiệm vụ tiếp theo không chạy. Để giải quyết vấn đề này, bạn sẽ cần một loại cơ chế phát hiện nào đó cho dù nhiệm vụ ngày càng nhiều về thời gian.
Tuy nhiên, đây không phải là tình huống phổ biến khi sử dụng trong sản xuất.
Một giải pháp khác là phân lớp bộ lập lịch celerybeat và ghi đè phương pháp đánh dấu của nó. Sau đó, cho mỗi đánh dấu thêm một khóa trước khi xử lý nhiệm vụ. Điều này làm cho chắc chắn rằng chỉ cần các bộ phận cần tây có cùng nhiệm vụ định kỳ sẽ không xếp hàng các tác vụ giống nhau nhiều lần. Chỉ có một celerybeat cho mỗi đánh dấu (một người thắng điều kiện chủng tộc) sẽ xếp hàng nhiệm vụ. Trong một celerybeat đi xuống, với đánh dấu tiếp theo một số khác sẽ giành chiến thắng trong cuộc đua.
Điều này tất nhiên có thể được sử dụng kết hợp với giải pháp đầu tiên.
Tất nhiên điều này để làm việc phụ trợ bộ nhớ cache cần phải được nhân rộng và/hoặc chia sẻ cho tất cả các máy chủ.
Đó là một câu hỏi cũ nhưng tôi hy vọng nó sẽ giúp mọi người.