【问题标题】:Pickle Queue objects in pythonpython中的Pickle Queue对象
【发布时间】:2013-05-25 21:34:11
【问题描述】:

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

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 对象?

【问题讨论】:

  • 你需要Queue.Queue的同步功能吗?也就是说,您是使用队列在各个线程之间进行通信,还是仅仅作为常规数据结构?
  • 只是一个普通的数据结构

标签: python python-2.7 pickle


【解决方案1】:

我建议用collections.deque 替换您对Queue.Queue 的使用。 Queue 类旨在用于线程之间的同步通信,因此在用作常规数据结构时会产生一些不必要的开销。 collections.deque 是一个更快的选择。 (“deque”这个名字读作“deck”,意思是“双端队列”。)

deque 类确实具有与Queue 类型不同的 API,但在它们之间转换应该很容易。使用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.'

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      相关资源
      最近更新 更多