2009-08-18 13 views
8

Tengo una cola (desde el módulo Queue) y deseo obtener acceso indexado en ella. (es decir, poder solicitar el elemento número cuatro en la cola, sin quitarlo de la cola.)La mejor manera de obtener acceso indexado a una cola Python, seguro para hilos

Vi que una cola utiliza un deque internamente, y deque tiene acceso indexado. La pregunta es, ¿cómo puedo usar el deque sin (1) arruinar la cola, (2) romper la seguridad del hilo?

+1

¿Por qué está utilizando una cola y no enqueue y desclasifica las cosas secuencialmente? ¿Es esto solo un objeto compartido entre hilos? –

+0

No estoy seguro de lo que quiere decir con "enqueue y dequeueing secuencialmente". Ni siquiera entiendo su segunda pregunta: Sí, la cola se comparte entre hilos. –

+1

Queue tiene las cosas en cola y dequeued en orden. La idea de "en orden" significa que rara vez se accede a ellos, excepto para agregar a un extremo y pop desde el otro extremo. ¿Por qué estás rompiendo esta suposición predeterminada en torno a "hacer cola"? –

Respuesta

10
import Queue 

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

Es, naturalmente, esenciales para liberar el mutex si la indexación tiene éxito o plantea una IndexError, y estoy usando una declaración with para eso. En las versiones anteriores de Python, se usaría el try/finally con el mismo efecto.

+1

Tan limpio ... Estoy jugando con hilos en Java ahora, y es No es gracioso. –

+0

gran respuesta. Desafortunadamente, no está documentado en ninguna parte que Queue sea adecuado (e incluso signifique, como dices) que se le subclasifique con acceso a sus miembros internos. Su ser "público" es la única pista. Ni siquiera en el código fuente del módulo Queue.py lo dice explícitamente, y esto es una pena. Su fragmento de código en esta respuesta debe ser un ejemplo en la documentación lib estándar de Queue, IMHO –

+0

@eliben, tiene razón en que los documentos de las partes internas de Queue.py son lamentablemente ineficientes, pero al menos son estar un poco mejor ... por ejemplo en el momento en que documentamos su subclassability (receta 9.3 en la segunda edición del Cookbook) que tampoco estaba en los documentos, ahora se suministran al menos un par de subclases útiles ... ;-). –

Cuestiones relacionadas