2
我需要對一個queue.Queue執行一組操作,特別是通過它並打包重複的連續元素。我也想確保在這組操作中只有一個線程訪問隊列。我看到隊列對象有一個互斥鎖,但我也假定這是隊列在自己的操作過程中執行鎖定。另一個互斥體不保證隊列不被其他線程訪問,除非我組織我的代碼來鎖定第二個互斥體。在線程隊列上執行多個操作的正確方法是什麼?
爲了安全地執行這些操作,有沒有一個技巧我不知道?
我需要對一個queue.Queue執行一組操作,特別是通過它並打包重複的連續元素。我也想確保在這組操作中只有一個線程訪問隊列。我看到隊列對象有一個互斥鎖,但我也假定這是隊列在自己的操作過程中執行鎖定。另一個互斥體不保證隊列不被其他線程訪問,除非我組織我的代碼來鎖定第二個互斥體。在線程隊列上執行多個操作的正確方法是什麼?
爲了安全地執行這些操作,有沒有一個技巧我不知道?
爲此目的使用隊列對象的互斥鎖。正是在那裏同步對基礎隊列的修改。
也許是子類並添加一個方法(如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)
使用BlockingQueue實現。他們嵌入了同步。 –