Python中的Pickle Queue对象 [英] Pickle Queue objects in python
问题描述
我有一个使用Queue对象列表的类.我需要腌制此类,包括保存在队列对象中的信息.例如:
I have a class that uses a list of Queue objects. I need to pickle this class including the information saved in the queue objects. For example:
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
是否可以腌制Queue对象?
Is there a work around to pickle Queue objects?
推荐答案
我建议将您对Queue.Queue
的使用替换为collections.deque
. Queue
类旨在用于线程之间的同步通信,因此当用作常规数据结构时,它将具有一些不必要的开销. collections.deque
是更快的选择. (名称"deque"发音为"deck",意思是双端队列".)
I suggest replacing your uses of Queue.Queue
with collections.deque
. The Queue
class is intended to be used for synchronized communication between threads, so it will have some unnecessary overhead when used as a regular data structure. collections.deque
is a faster alternative. (The name "deque" is pronounced "deck" and means "double-ended queue".)
deque
类确实具有与Queue
类型不同的API,但是在它们之间进行转换应该非常容易.使用deque.append
代替Queue.put
和deque.popleft
代替q.get()
(或者,如果您想换个方向,请使用appendleft
和pop
).无需调用Queue.empty
,只需将deque
实例用作布尔值(就像您要测试一个空列表一样).
The deque
class does have a different API than the Queue
type, but it should be pretty easy to translate between them. Use deque.append
in place of Queue.put
and deque.popleft
in place of q.get()
(or appendleft
and pop
, if you feel like going the other direction). Rather than calling Queue.empty
, just use a deque
instance as a Boolean value (like you do to test for an empty list).
deque
实例是可腌制的:
>>> 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.'
这篇关于Python中的Pickle Queue对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!