2011-09-18 68 views
2

生產者線程查詢數據存儲並將對象放入隊列中。然後,每個消費者線程將從共享隊列中拉出一個對象,並對外部服務進行非常長的調用。當呼叫返回時,消費者將該對象標記爲已完成。如何防止共享隊列中的重複值

我的問題是,我基本上必須等到隊列爲空之後,製作人才能再次添加它,否則我可能會讓重複的郵件通過。

有人問IRC一個很好的問題,我想我會在這裏添加答案。問題是,「爲什麼你的製作人製作重複?」答案基本上是製片人製作重複片,因爲我們不跟蹤每個對象的「發送」狀態,只有「發送」或「未發送」。

有沒有一種方法可以檢查隊列中的重複項?

回答

2

在我看來,在隊列中有重複的對象並不是一個真正的問題;你只是想確保你只對每個對象執行一次處理。

如果是這樣,我建議你有消費者線程使用一組來跟蹤已經發現的對象。如果一個對象不在集合中,添加並處理它;如果它在集合中,則將其忽略爲重複。

如果這將是一個長時間運行的系統,而不是一個集合,請使用OrderedDict跟蹤所查看的對象。然後不時清理OrderedDict中最舊的條目。

0

你是指將對象標記爲已完成是什麼意思?你是否將對象留在隊列中並更改標誌?或者你的意思是你將對象標記爲已經在數據存儲中完成。如果前者,隊列是如何變空的?如果是後者,爲什麼不在開始處理之前從隊列中刪除對象?

假設您希望能夠處理處理失敗而不丟失數據的情況,一種方法是創建一個單獨的工作隊列和處理隊列。然後,當消費者從工作隊列中抽取工作時,他們將其移至處理隊列,並開始對外部服務的長時間運行呼叫。當它返回時,它可以標記數據完整並將其從處理隊列中移除。如果爲數據放入處理隊列時添加字段,則可能會運行定期作業來檢查超過特定時間的處理作業並嘗試重新處理它們(在重新啓動之前更新時間戳記)。

1

如果您在Queue模塊中討論類:在API之後,無法檢測隊列是否包含給定對象。