[pyar] Ejecucion concurrente de funciones

Angel Freire cuerty en gmail.com
Mie Ene 26 16:02:20 ART 2011


2011/1/26 Julian Agustin Cardonnet <jcardonnet en gmail.com>:
> Hola Lista
>
> Herede una aplicacion hecha en web2py y estoy buscando una forma
> sencilla de paralelizar la ejecucion de algunas funciones I/O bound
> (son todos requests HTTP). Hasta ahora se ejecutaba todo
> secuencialmente pero la latencia es demasiado alta (porque son muchas
> invocaciones).
>
> El cuello de botella esta ahi, porque lo medi.
>
> Los requests son independientes entre si, no comparten datos ni hacen
> nada raro que pueda producir un deadlock u otra situacion indeseable.
>
> Usando multiprocessing.pool().map obtuve algunas mejoras en los casos
> en que se invoca el mismo metodo para todo, por ej
> urllib2.urlopen().read() pero quisiera tambien poder ejecutar
> concurrentemente funciones distintas sin tener que hacer muchos
> malabares. Estas "funciones distintas" son por ej invocaciones al API
> de Yahoo currentemente con unas al API de Google.
>
> Por "sin hacer muchos malabares" me refiero a que preferiria no tener
> que manejar la concurrencia a mano sino algo que resulte transparente
> como el map concurrente: le doy que funciones quiero ejecutar, con que
> parametros y cuando termina tengo todos los resultados en un array.
>
> Por lo que entiendo en este caso el GIL no es un obstaculo porque como
> aclare al principio son operaciones I/O bound y por lo tanto
> simplemente lo que quiero evitar es tener que quedarme cruzado de
> brazos mientras espero la respuesta del webserver.
>
> Usando lo que python trae built-in por lo que estuve leyendo me
> parecio un quilombo (manejar a mano los threads o procesos)
> innecesario y por otro lado la multitud de bibliotecas e interpretes
> alternativos me resulto un poco abrumadora y en una de esas alguno por
> aca tiene experiencia en este tipo de cosas y me puede cantar la posta
> o por lo menos guiarme para que lado correr.
>
> Las restricciones que tengo son:
>  - El interprete es cpython 2.6 y no lo puedo cambiar.
>  - Corre en linux
>
> Gracias y Saludos
> Julian
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

Si queres manejarte con procesos o hilos te recomiendo utilizar
threading [0] que es un modulo bastante alto nivel para manejar
threads en Python. En cuanto a las peticiones HTTP te recomendaría
utilizar pycurl [1] dado que al estar completamente basada en una
librería en C libera a la GIL mas tiempo.

Pero si en realidad queres hacer muchos pedidos HTTP en paralelo
utiliza el objeto CurlMulti de pycurl [2], creo que se ajusta mas a lo
que necesitas.

[0] http://docs.python.org/library/threading.html
[1] http://pycurl.sourceforge.net/
[2] http://pycurl.sourceforge.net/doc/curlmultiobject.html

-- 
http://blog.cuerty.com

"If you want to set off and go develop some grand new thing, you don't
need millions of dollars of capitalization. You need enough pizza and
Diet Coke to stick in your refrigerator, a cheap PC to work on and the
dedication to go through with it."
- John Carmack



More information about the pyar mailing list