¿Se necesita una cola de Python para una secuencia de bytes simple entre subprocesos?

StackOverflow https://stackoverflow.com/questions/1640112

  •  08-07-2019
  •  | 
  •  

Pregunta

Tengo un subproceso simple que toma bytes de un zócalo Bluetooth RFCOMM (tipo puerto serie) y los descarga en un Queue.Queue (FIFO), que parece ser el método típico para intercambiar datos entre hilos. Funciona bien.

¿Es esto excesivo? ¿Podría usar un bytearray y luego tener mi hilo lector .append (somebyte) y la función de procesamiento solo .pop (0) ? No estoy seguro de si las protecciones en la cola están destinadas a colas más complejas de múltiples productores y consumidores. y un desperdicio para un flujo de bytes punto a punto. Hacer cosas como vaciar la cola o tomar varios bytes parece más incómodo con la cola frente a un tipo de datos más simple.

Supongo que la respuesta podría tener que ver con si .pop () es atómico, pero ¿importaría entonces? ...

¿Fue útil?

Solución

Con Queue , tiene garantizado para estar seguro en cualquier implementación y versión de Python. Confiando en este o aquel método de algún otro objeto siendo "atómico" (en una implementación y versión dada) normalmente lo deja a merced de esta "atomicidad" no es una garantía sólida (solo un artefacto de implementación para la versión de punto específica & amp; c que está utilizando) y, por lo tanto, se introducen condiciones de carrera MUY difíciles de depurar con cualquier actualización o puerto a otras implementaciones de Python.

Si su perfil le dice que las fuertes y generales garantías de Queue están siendo un cuello de botella para su caso de uso específico de productor-consumidor, haga su propia cola FIFO más simple garantizada para ser segura. corriente. Por ejemplo, si descubrió que (neto de condiciones de carrera) append y pop serían perfectos para su uso, simplemente haga una clase que proteja a cada uno con un candado adquirir / liberar (use una instrucción with ) - Queue agrega una sobrecarga minúscula para admitir múltiples productores y consumidores, ¡y puede reducir esos pocos nanosegundos! -)

Otros consejos

Sí, pop () es atómico, pero me quedaría con Queue si el rendimiento no es muy importante.

Si la velocidad de entrada es lo suficientemente rápida, siempre puede almacenar los bytes en una cadena antes de insertarlos en la cola. Eso probablemente aumentará el rendimiento al reducir la cantidad de bloqueo realizado, a expensas de un poco de latencia adicional en el extremo receptor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top