2014-04-18 102 views
2

我需要對一個queue.Queue執行一組操作,特別是通過它並打包重複的連續元素。我也想確保在這組操作中只有一個線程訪問隊列。我看到隊列對象有一個互斥鎖,但我也假定這是隊列在自己的操作過程中執行鎖定。另一個互斥體不保證隊列不被其他線程訪問,除非我組織我的代碼來鎖定第二個互斥體。在線程隊列上執行多個操作的正確方法是什麼?

爲了安全地執行這些操作,有沒有一個技巧我不知道?

+0

使用BlockingQueue實現。他們嵌入了同步。 –

回答

2

爲此目的使用隊列對象的互斥鎖。正是在那裏同步對基礎隊列的修改。

也許是子類並添加一個方法(如https://stackoverflow.com/a/7641976/132382中的那個)來打包self.queue中的連續副本?

另外,我認爲更好的是,子類queue.Queue並覆蓋_put,以便在連續重複被添加到隊列後立即處理。的_put調用已經互斥體保護(和_put_get等都是怎麼樣LifoQueue標準的子類來實現):

class PackedQueue(queue.Queue): 

    def _put(self, item): 
    if item != self.queue[-1]: 
     self.queue.append(item) 
相關問題