2009-08-19 9 views
6

En la clase queue del módulo Queue, hay algunos métodos, a saber, qsize, empty y full, cuya documentación dice que "no son confiables".Python: ¿Por qué algunos de los métodos de Queue.queue "no son confiables"?

¿Qué exactamente no es confiable acerca de ellos?

me di cuenta de que on the Python docs sitio, se dice lo siguiente acerca de qsize:

Nota, qsize()> 0 no garantiza que un encuentro posterior() no bloque, ni se qsize() < maxsize garantiza que put() no bloqueará.

Yo personalmente no considero que el comportamiento "poco fiable". ¿Pero esto es lo que significa "poco confiable", o hay algún defecto más siniestro en estos métodos?

+0

Un enlace a los documentos específicos que usted se refiere estaría bien. –

+3

La documentación es inútil. No puede simplemente decir "esta función no es confiable" en la documentación; necesitas decir exactamente qué es poco confiable al respecto. –

+0

Sin duda http://docs.python.org/library/queue.html. –

Respuesta

2

No sé a qué módulo de cola se refiere, ¿puede proporcionar un enlace?

Una posible fuente de falta de fiabilidad: en general, una fila es leída por un hilo y escrita por otro. Si usted es el único hilo que accede a una cola, entonces son posibles las implementaciones confiables de qsize(), empty() y full(). Pero una vez que se involucran otros hilos, el valor de retorno de estos métodos puede estar desactualizado en el momento de la prueba.

+0

Cola.py, parte de la biblioteca estándar. –

+0

Hay un módulo Queue.py en la biblioteca estándar de Python, agregué comentarios a la pregunta para apuntar a sus documentos. La fuente está en http://svn.python.org/view/python/trunk/Lib/Queue.py?view=markup. –

+0

Ah, vale, supuse tontamente que Cola no podría estar en el archivo estándar porque no cumple con las convenciones de nomenclatura PEP8. Supongo que es una excepción. Gracias por el enlace! – user9876

10

Sí, los documentos usan "no confiable" aquí para transmitir exactamente este significado: por ejemplo, en cierto sentido, qsize no le dice cuántas entradas hay "ahora mismo", un concepto que no es necesariamente muy significativo en un mundo multiproceso (excepto en puntos específicos donde se toman precauciones de sincronización) - le dice cuántas entradas tenía "hace un tiempo" ... cuando actúa sobre esa información, incluso en el siguiente código de operación, la cola podría tener más entradas, o menos, o ninguna, tal vez, dependiendo de qué otros hilos han estado entretanto mientras tanto (si algo ;-).

+3

"No fiable" sugiere cualquier cantidad de problemas. Estas funciones deben ser completamente confiables para ciertos casos de uso (por ejemplo, detectar si una inserción puede bloquear, desde una cola con un solo hilo productor). "No confiable" no tiene sentido. –

+1

@Alex Martelli: ¿Cómo puede el tamaño informado por qsize no ser el tamaño en este momento? Después de todo, la persona que llama de qsize retiene el mutex, lo que significa que es el único subproceso que accede a la cola en ese momento. ¿O está utilizando el término "ahora mismo" como en "derecha _después_ de que termine de llamar a qsize"? –

+3

Es el tamaño "atrás cuando" el hilo de la llamada sostenía el mutex, que se libera (en un 'finally') como parte del' return'; ese es un instante anterior al instante en que el código de llamada en el hilo llamante RECIBE el resultado. El "ahora mismo" es el instante en que el resultado se vincula a una variable o se utiliza de cualquier otra forma: en ese momento, el resultado que se vincule o se use de otro modo ya podría estar desactualizado. –

Cuestiones relacionadas