2009-08-18 7 views
8

Mam kolejkę (z modułu Queue) i chcę uzyskać do niej dostęp indeksowany. (tj. możliwość zażądania pozycji numer cztery w kolejce, bez usuwania jej z kolejki).Najlepszy sposób na uzyskanie dostępu indeksowanego do kolejki w języku Python, wątkowo bezpieczny

Widziałem, że kolejka używa wewnętrznie deque, a deque ma indeksowany dostęp. Pytanie brzmi, w jaki sposób mogę użyć tej deque bez (1) zepsucia kolejki, (2) zerwania bezpieczeństwa wątku.

+1

Dlaczego używasz kolejki i nie kolejkujesz i nie piszczysz po kolei? Czy jest to tylko wspólny obiekt między wątkami? –

+0

Nie jestem pewien, co masz na myśli, mówiąc o "sekwencjonowaniu i piszeniu kolejnych elementów". Nie rozumiem nawet twojego drugiego pytania: Tak, kolejka jest dzielona między wątkami. –

+1

Kolejki mają rzeczy uporządkowane i uporządkowane w kolejności. Pomysł "w porządku" oznacza, że ​​rzadko się do nich można dostać, poza dołączeniem do jednego końca i pop z drugiego końca. Dlaczego przełamujesz to domyślne założenie wokół "kolejkowania"? –

Odpowiedz

10
import Queue 

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

To oczywiście kluczowe aby zwolnić mutex czy indeksowanie powiedzie lub podnosi IndexError i używam with oświadczenie o tym. W starszych wersjach Pythona do tego samego efektu byłby używany kod try/finally.

+1

Tak czysto ... Robię teraz bałagan na wątkach w Javie, i to jest nie tak zabawne. –

+0

świetna odpowiedź. Niestety nie jest to udokumentowane w żadnym miejscu, że kolejka jest odpowiednia (a nawet miała na myśli, jak mówisz) subklasyzacja z dostępem do jej wewnętrznych członków. Ich bycie "publicznym" jest jedyną wskazówką. Nawet w kodzie źródłowym modułu Queue.py nie mówi tego wprost, a to wstyd. Twój fragment kodu w tej odpowiedzi powinien być przykładem w standardowej dokumentacji biblioteki kolejki, IMHO –

+0

@eliben, masz rację, że dokumenty wewnętrzne Queue.py są (i od dawna) żałośnie nieskuteczne, ale przynajmniej są trochę lepiej ... np w tym czasie udokumentowaliśmy jego subklasowalność (przepis 9.3 w drugim wydaniu książki kucharskiej), którego też nie było w dokumentach, teraz przynajmniej kilka użytecznych podklas jest dostarczanych ... ;-). –

Powiązane problemy