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