2013-05-25 2 views
4

Queue 객체 목록을 사용하는 클래스가 있습니다. 큐 객체에 저장된 정보를 포함하여이 클래스를 피클 링해야합니다. 예를 들어 :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) 

오류

raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle lock objects 

대기열 객체를 피클 약 작업이 있습니까 반환?

+1

당신은 Queue.Queue''의 동기화 기능 필요하십니까? 즉, 대기열을 사용하여 다양한 스레드간에 통신하거나 정기적 인 데이터 구조처럼 통신하고 있습니까? – Blckknght

+0

그냥 일반적인 데이터 구조 –

답변

8

Queue.put.pop 에뮬레이트하기 위해 FIFO를 에뮬레이션 .appendleft을 사용해야합니다. Queue 클래스는 스레드 간의 동기화 된 통신을 위해 사용되므로 일반 데이터 구조로 사용될 때 불필요한 오버 헤드가 발생합니다. collections.deque이 더 빠른 대안입니다. ("deque"라는 이름은 "갑판"이라고 발음하며 "양단 큐"를 의미합니다.)

deque 클래스는 Queue 유형과 다른 API를 가지고 있지만 두 클래스간에 쉽게 변환 할 수 있어야합니다. Queue.putdeque.popleft 대신 deque.append을 사용하고 q.get() (또는 다른 방향으로 가고 싶다면 appendleftpop) 대신에 사용하십시오. Queue.empty을 호출하는 대신 빈 목록을 테스트 할 때처럼 deque 인스턴스를 부울 값으로 사용하면됩니다.

deque 인스턴스 picklable 있습니다

>>> 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의 동기화 기능은 필요하지 않습니다. 따라서 Queue.Queue 클래스가 자신을 기본 큐 데이터 구조로 사용하는 collections.deque을 사용하십시오. 당신은 내가 collections.dequeQueue.Queue의 당신의 사용을 대체하는 것이 좋습니다 Queue.get