2013-05-25 4 views
4

У меня есть класс, который использует список объектов Queue. Мне нужно рассортировать этот класс, включая информацию, сохраненную в объектах очереди. Например:Объекты очереди Pickle в python

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?

+1

ли вам нужны функции синхронизации для 'Queue.Queue'? То есть, вы используете свои очереди для связи между различными потоками или просто как регулярная структура данных? – Blckknght

+0

просто регулярная структура данных –

ответ

8

Я предлагаю заменить ваши применения в Queue.Queue с collections.deque. Класс Queue предназначен для синхронной связи между потоками, поэтому при использовании в качестве обычной структуры данных он будет иметь ненужные служебные данные. collections.deque - более быстрая альтернатива. (Название «Deque» произносится как «палуба» и означает «Двухсторонние очереди».)

deque класс имеет различные API, чем Queue типа, но это должно быть довольно легко переводить между ними. Используйте deque.append вместо Queue.put и deque.popleft вместо q.get() (илии pop, если вам хочется перейти в другое направление). Вместо того, чтобы называть 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.' 
3

Как вы прокомментировали @Blckknght, вам не нужны функции синхронизации Queue.Queue. Поэтому просто используйте collections.deque, что класс Queue.Queue использует себя в качестве структуры данных основной очереди. Вы должны будете использовать .appendleft подражать FIFO Queue.put и .pop подражать Queue.get