timeout en execute de mysqldb

Gabriel Genellina gagsl-py2 en yahoo.com.ar
Sab Abr 21 04:47:07 CEST 2007


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

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).

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().

> 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.

> 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.

-- 
Gabriel Genellina

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


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