2010-01-12 44 views
1

我有一個很長的mysql隊列。我有1個工作者腳本處理每個隊列。通過長時間運行多個工人

但是當這個工作者正在運行時,數據庫可能會被更新或者得到新的行插入。

示例工人腳本

get_current_queue = SELECT from queue... 

while(get_current_queue) { 

update_current_row_from_queue "processing" 

//some cpu intensive processing here that takes varying amount of time. 

} 

的問題是,工人腳本需要不同的時間量取決於在給定時刻的隊列有多長,並且每個CPU的處理花費的時間(視頻轉換爲前)。

因此,當我在第一個工作人員運行時運行另一個工作人員腳本時,第一個工作人員在隊列數據庫中尚未標記爲「處理」的隊列將落入第二個工作人員待辦事項列表。

我不知道如何解決這個問題。

當一個工人運行時,我需要一些方法來標記這個批處理,所以只有這個工人會運行它。

並且在運行時,插入新行後,如果我選擇啓動另一個工人,它可以工作。

回答

1

爲當前正在處理該行的工作人員標識提供表隊列中的一個字段。

首先做update queue set worker_id = myid Where worker_id = '' LIMIT 100 然後select * from queue where worker_id = myid並處理這些行。 畢竟從隊列中刪除這些行或將它們標記爲已處理。

您可能需要某種回退來覆蓋當您的某位工人正在處理通過將worker_id重新設置爲「'來解鎖未處理的行時死亡的情況。

1

卡米爾有一個很好的答案。我想通過建議工人一次只能得到一行。這樣,隊列將被更加緊密地處理爲它的原始順序;而且,與從數據庫中檢索行相比,如果中間的操作確實需要很長時間,那麼您不需要一次獲取多個行。

這也使得檢查工人是否已經死亡更容易。由於每個員工在任何時間只能有一項任務。

我實現了一個像這樣的系統,每個週末有大量運行imagemagick處理超過250,00張圖片的機器。 (這是工作進行的時間。)然後,我可以在一週內無人關閉的情況下關閉工作人員,並在工作量增加時將其解僱。像冠軍一樣工作。

+0

好吧,你是指每行的工人?在任何特定時間運行的員工的最高門檻是多少?如果有很多工人每人只運行一行,那麼效率會不會更低?我想聽聽更多關於這個細節的信息,這很有趣。 – ggggggggg

相關問題