python中Pickle队列对象

2024-10-01 02:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用队列对象列表的类。我需要pickle这个类,包括保存在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)

返回错误

^{pr2}$

有没有办法解决pickle队列对象的问题?在


Tags: 对象importself信息obj列表队列queue
2条回答

我建议将Queue.Queue替换为collections.dequeQueue类用于线程之间的同步通信,因此当用作常规数据结构时,它将有一些不必要的开销。collections.deque是一种更快的选择。(“deque”的发音是“deck”,意思是“双端队列”。)

deque类与Queue类型有不同的API,但是在它们之间转换应该非常容易。用deque.append代替Queue.put,用deque.popleft代替{}(或者{}和{},如果你想换个方向的话)。不要调用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.'

正如您对@Blckknght的评论,您不需要Queue.Queue的同步特性。所以只要使用collections.dequeQueue.Queue类将其自身用作底层队列数据结构。您必须使用.appendleft来模拟FIFOQueue.put和{}来模拟Queue.get

相关问题 更多 >