簡體   English   中英

在celerybeat中一次只運行一個任務

[英]Making only one task run at a time in celerybeat

我有一個任務,我每分鍾使用celerybeat執行一次。 它工作正常。 但有時,任務運行需要幾秒鍾,因為運行任務的兩個實例。 這導致一些競爭條件搞砸了。

我可以(並且可能應該)修復我的任務以正常工作,但我想知道芹菜是否有任何內置的方法來確保這一點。 我粗略的谷歌搜索和RTFM沒有產生任何結果。

你可以使用memcached或者你的數據庫來添加一個鎖

如果您使用cron計划或時間間隔來運行定期任務,您仍然會遇到問題。 您始終可以使用數據庫或緩存甚至文件系統來使用鎖定機制,也可以使用前一個任務來安排下一個任務,這可能不是最好的方法。 這個問題可能對你有所幫助: django celery:如何設置任務以特定的間隔以編程方式運行

鎖定是一種很好的方式,無論是節拍還是cron。

但是,請注意節拍作業在工作人員開始時間運行,而不是在節拍運行時間。

這導致我即使在鎖定的情況下也能獲得競爭條件。 讓我們說這名工作人員已關閉並擊敗了10個工作崗位。 當celery以4個進程啟動時,所有4個進程都會獲取任務,在我的情況下,1或2將同時獲取並設置鎖定。

解決方案一是使用帶鎖的cron,因為cron將在那時執行,而不是在工作人員啟動時執行。

解決方案二是使用稍微更先進的鎖定機制來處理競爭條件。 對於redis,請查看setnx或更新的redlock 這篇博文非常好,包括一個使用redis-py鎖定機制的裝飾模式: http//loose-bits.com/2010/10/distributed-task-locking-in-celery.html

您可以嘗試將類字段添加到包含您正在運行的函數的對象中,並將該字段用作“其他人正在工作或不工作”控件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM