2009-08-18 6 views
8

(Queue 모듈의 큐가 있음) 인덱스 된 액세스 권한을 얻고 싶습니다. 큐에서 아이템 번호 4를 요청할 수 있습니다.스레드로부터 안전한 파이썬 큐에 대한 인덱스 된 액세스를 얻는 가장 좋은 방법

대기열은 내부적으로 deque를 사용하고 양단 큐는 액세스를 색인하는 것을 보았습니다. 문제는 (1) 대기열을 어지럽히 지 않고, (2) thread-safety를 깨지 않고 deque를 어떻게 사용할 수 있는가입니다.

+1

왜 대기열을 사용하고 순차적으로 항목을 대기열에 포함하거나 대기열에서 제외 해제하지 않습니까? 스레드 간의 공유 된 객체입니까? –

+0

"순차적으로 항목을 대기열에 넣고 대기열에서 빼는 것"이 ​​무슨 뜻인지 잘 모르겠습니다. 나는 두 번째 질문을 이해하지 못한다. 예, 큐는 스레드간에 공유됩니다. –

+1

대기열은 대기열에 넣고 대기열에서 제외합니다. "순서대로"라는 말은 한쪽 끝에 추가하고 다른 쪽 끝에서 팝업하는 것 이외에는 거의 액세스하지 않는다는 의미입니다. 왜 당신은 "큐잉"에 대해이 기본 가정을 깨뜨리고 있습니까? –

답변

10
import Queue 

class IndexableQueue(Queue): 
    def __getitem__(self, index): 
    with self.mutex: 
     return self.queue[index] 

그것은 인덱싱이 성공 또는 IndexError를 제기 여부를 뮤텍스를 해제하는 것이 중요 물론이고, 내가 그에 대한 with 문을 사용하고 있습니다. 구형 Python 버전에서는 try/finally이 동일한 효과를냅니다.

+1

이렇게 깨끗해 ... 지금 Java의 스레드를 망쳤습니다. 그렇게 재밌지 않아. –

+0

좋은 답변입니다. 불행히도 큐가 내부 구성원에 대한 액세스로 하위 클래스 화되도록 (심지어는 사용자가 말한 것처럼) 적절한 위치에 문서화되어 있지 않습니다. 그들의 "공개"가 유일한 단서입니다. Queue.py 모듈의 소스 코드조차도 명시 적으로 말하지 않습니다. 이것은 수치 스럽습니다. 이 답변에있는 코드 스 니펫은 Queue, IMHO –

+0

@eliben의 표준 lib 문서에있는 예제 여야합니다. Queue.py의 내부 문서는 비참하지만 (적어도 오랫동안) 비효율적이지만, 적어도 조금 더 좋아 지는데 ... 예. 그 당시 우리는 문서에 없었던 하위 분류 성 (요리 책 2 판의 9.3 절)을 문서화했지만, 지금은 최소한 두 개의 유용한 하위 클래스가 제공됩니다. ;-). –