[Python-es] ¿queue.put bloquea?

Daπid davidmenhur en gmail.com
Lun Ene 20 15:23:09 CET 2014


2014/1/18 Chema Cortes <py en ch3m4.org>

> Este relato es habitual en la programación concurrente.
>
> Queue se utiliza para "sincronismo" entre workers. El sincronismo
> requiere establecer bloqueos, que aumentan en número geométricamente
> al aumentar el número de workers, haciendo el programa mucho más lento.
>
> Si no necesitas "sincronismo", o sea, si no necesitas que los datos se
> encolen en el mismo orden que se generan (el orden lo podrías
> recomponer después usando las marcas temporales), usa mejor
> collections.deque cuyas operaciones son "atómicas" (no bloqueantes).
> Ojo con lo que puede llegar a crecer si no eres capaz de sacar datos
> al mismo ritmo que se meten.
>


El orden en el que se ejecuten es completamente irrelevante. deque parece
una opción muy buena, pero, desafortunadamente, no parece ser compatible
con multiprocessing.

Aquí está el esqueleto de mi programa:

https://gist.github.com/Dapid/8520567

Si uso deque, el proceso siempre ve la misma cola vacía. Si lo convierto en
un Thread, puede leer los datos del programa principal, pero no  los datos
generados desde un multiprocessing.pool.

¿Hay alguna otra alternativa?
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140120/1ef11786/attachment.html>


Más información sobre la lista de distribución Python-es