2013-05-25 44 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