2013-05-25 95 views
4

我有一個使用Queue對象列表的類。我需要醃製這個類,包括保存在隊列對象中的信息。例如:python中的pickle隊列對象

import Queue 
import pickle 

class QueueTest(object): 
    def __init__(self): 
     self.queueList = [] 
    def addQueue(self): 
     q = Queue.Queue() 
     q.put('test') 
     self.queueList.append(q) 


obj = QueueTest() 
obj.addQueue() 

with open('pickelTest.dat','w') as outf: 
    pickle.dump(obj,outf) 

返回錯誤

raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle lock objects 

是否有變通鹹菜隊列對象?

+1

你需要Queue.Queue'的'同步功能?也就是說,你是使用你的隊列在不同的線程之間進行通信,還是隻是像普通的數據結構一樣? – Blckknght

+0

只是一個常規的數據結構 –

回答

8

我建議用collections.deque更換的Queue.Queue您的用途。 Queue類旨在用於線程之間的同步通信,因此在用作常規數據結構時會產生一些不必要的開銷。 collections.deque是一個更快的選擇。 (名稱「deque」被讀作「deck」,意思是「雙端隊列」。)

deque類確實與API Queue類型不同,但它們之間應該很容易翻譯。使用deque.append代替Queue.putdeque.popleft代替q.get()(或appendleftpop,如果你想去其他方向)。而不是調用Queue.empty,只需使用deque實例作爲布爾值(就像您測試空列表一樣)。

deque實例是picklable:

>>> import collections, pickle 
>>> q = collections.deque(["test"]) 
>>> pickle.dumps(q) 
b'\x80\x03ccollections\ndeque\nq\x00]q\x01X\x04\x00\x00\x00testq\x02a\x85q\x03Rq\x04.' 
3

正如您評論過@Blckknght,您不需要Queue.Queue的同步功能。因此,只需使用collections.dequeQueue.Queue類將其本身用作底層隊列數據結構。你將不得不使用.appendleft效仿FIFO Queue.put.pop效仿Queue.get