Python中的Pickle Queue对象

Joe*_*een 5 python pickle python-2.7

我有一个使用Queue对象列表的类.我需要挑选这个类,包括保存在队列对象中的信息.例如:

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)
Run Code Online (Sandbox Code Playgroud)

返回错误

raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle lock objects
Run Code Online (Sandbox Code Playgroud)

是否有工作来挑选Queue对象?

Blc*_*ght 9

我建议更换您的使用Queue.Queuecollections.deque.所述Queue类旨在用于线程之间的同步通信,所以作为常规数据结构一起使用时就会产生一些不必要的开销.collections.deque是一个更快的选择.(名称"deque"的发音为"deck",意思是"双端队列".)

deque班确实有比不同的API Queue类型,但它应该是很容易它们之间的转换.使用deque.append代替Queue.putdeque.popleft代替q.get()(或appendleftpop,如果你想去其他方向).而不是调用Queue.empty,只需使用deque实例作为布尔值(就像测试空列表一样).

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.'
Run Code Online (Sandbox Code Playgroud)