Python中的Pickle Queue对象 [英] Pickle Queue objects in python

查看:172
本文介绍了Python中的Pickle Queue对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用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.putdeque.popleft代替q.get()(或者,如果您想换个方向,请使用appendleftpop).无需调用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆