timeout en execute de mysqldb

Carles Pina i Estany carles en pina.cat
Sab Abr 21 10:46:19 CEST 2007


Hola,

On Apr/20/2007, Gabriel Genellina wrote:
> En Fri, 20 Apr 2007 20:21:41 -0300, Carles Pina i Estany <carles en pina.cat>  
> escribió:
> 
> >Conecto a una base de datos con el módulo MySQLdb. Necesito controlar
> >que el método execute tarde un tiempo "finito" (es decir, menos de 1 o 2
> >segundos) ya que la red puede caer, etc.
> >
> >He probado a hacer algo como:
> >--------
> >signal.signal(signal.SIGALRM,handler)
> >signal.alarm(1)
> >cursor.execute(sql)
> >signal.alarm(0)
> >--------
> >
> >esta idea funciona con time.sleep(5), pero con el cursor.execute(sql) no
> >funciona (es posible que se desactiven las señales en el execute?)
> 
> No es que se desactivan, sino que Python no tiene oportunidad de  
> procesarla. Hasta tanto la ejecución no vuelva desde el modulo MySQLdb,  
> Python no tiene oportunidd de procesar nada, todo el código que se esta  
> ejecutando (incluso la espera) esta dentro de MySQLdb

ah ok!! cierto

> El handler "real" usado internamente (escrito en C), cuando recibe una  
> señal, sólo pone una marca en una tabla indicando "se recibio tal señal".  
> Cada N instrucciones ejecutadas (donde N=sys.getcheckinterval()) el  
> interprete mira la tabla y actúa en consecuencia (invocando el handler  
> Python especificado con signal.signal, por ejemplo).

genial explicación! ayer perdí bastante tiempo haciendo pruebas y dando
palos de ciego

> No puedo verificarlo ahora, pero si tu execute() demora más de 1 segundo,  
> tu handler se deberia invocar igual, pero *despues* que volvio del  
> execute().

tampoco lo puedo verificar ahora, pero por lo que explicas sería lógico
que pasase esto.

> >Cual es la mejor manera de hacerlo? Se me ocurre hacerlo con threads,
> >pero si lo pudiera evitar sería mucho mejor.
> 
> Sip: un thread de trabajo comunicado via Queue, o tal vez un proceso  
> separado usando pipes.

ok, pues así lo haré. No quería hacer un thread si no hacia falta, pero
si hace falta se hace :-)

> >Con Perl, para hacer lo mismo, tuve que hacer un "apaño" porqué en el
> >execute se desactivaban las señales, pero pude hacerlo sin threads y
> >bastante fácil. Cual es la mejor forma en Python?
> 
> Ninguna usando sólo DBAPI 2.0. Pero algunas bases de datos te dejan  
> especificar un timeout como parametro, usualmente al momento de crear la  
> conexion, no se si es el caso de MySQL.

el problema es que no es un problema en el lado de la base de datos.
Escribí que el execute tardara demasiado, pero pensando que hubiera
problemas de red. Vaya, que tengo una aplicación que hace queries
"siempre", pero si falla el enlace debería controlarlo. No es que el
servidor tarde en contestar, sinó que no me contestaría nunca (hago las
pruebas con un ifconfig eth0 down -o desconectando el cable).

Lo que has explicado, dónde se puede leer más? (lo mismo o cosas
parecidas). Libro, URL o vas directo al código de Python?

Gracias otra vez!

-- 
Carles Pina i Estany		GPG id: 0x8CBDAE64
	http://pinux.info	Manresa - Barcelona




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