[Python-es] ¿queue.put bloquea?

Chema Cortes py en ch3m4.org
Sab Ene 18 19:06:24 CET 2014


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

El 17/01/14 13:40, Daπid escribió:
> Hola:
> 
> Tengo una aplicación que genera datos en un pool de ocho
> trabajadores (joblib.Parallel) que son almacenados en una base de
> datos (Pytables) por un proceso paralelo (multiprocessing.Process).
> Los datos son transferidos a través de una cola.
> 
> Ahora bien: el bucle que genera los datos es muy rápido, hay datos 
> nuevos cada milésima de segundo. Mi pregunta es, cuando intento
> escribir en la cola, ¿se produce un bloqueo? ¿El resto de
> trabajadores tiene que esperar para escribir sus resultados? Al
> haber tantos procesos leyendo y escribiendo en la cola con tanta
> frecuencia, puede ser un factor importante.

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 objeto que pongo en la cola es:
> 
> [(etiqueta1, etiqueta2), [tiempo_a, valor1_a, valor2_a, valor3_a,
> (i1_a, i2_a)], [tiempo_b, valor1_b, valor2_b, valor3_b, (i1_b,
> i2_b)] ...]
> 
> donde el número de listas es variable (~10) y el proceso que
> guarda desempaqueta los valores para guardarlos en la tabla
> 
> etiqueta1, etiqueta2, tiempo_a, valor1_a, valor2_a, valor3_a, i1_a,
> i2_a etiqueta1, etiqueta2, tiempo_b, valor1_b, valor2_b, valor3_b,
> i1_b, i2_b ...
> 
> ¿Hay alguna forma más eficiente de hacer esta transferencia? Las 
> etiquetas serán guardadas como enteros sin sign de 32 bits, valores
> y tiempo floats de 32 bits e i1 e i2, float64.
> 
> 
> /David.
> 
> 
> _______________________________________________ Python-es mailing
> list Python-es en python.org 
> https://mail.python.org/mailman/listinfo/python-es FAQ:
> http://python-es-faq.wikidot.com/
> 


- -- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJS2sKZAAoJEFdWyBWwhL4FxIwH/iqhtitcaS4mXG48Sf2CG7Yk
0vVGY3GnID+q0pkUEQR0wVvwsbD/pKErwzosp7jbsubbAjHDMsnjXUKun29+4hud
oi9p5BPSaf/6eSQiTBkDoPF2RGOf7kBr+p99zKShtx4sUwbUR03xD3MG2HjGpiEj
u6WzsKwlqP892O71u4NXUckqR2V8F16LFkHAmfhjOIhr9tJy2ESkCjwf6QdZo48C
NgHYt5ZQfbLQLLCJJyZv7pZJpCP0fcNSe7b2oRVexs5yT1NELWk1vmmM7TdTaPT9
5/6Hdkz/6guY5ougIxbl0BzD+wlsH7FyXsjCJPKXb882mR9Hm3qV1EBYEE/nRG4=
=GSFa
-----END PGP SIGNATURE-----


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