J'essaie d'imposer une limite de temps aux requêtes dans MySQLDB en python. Je n'ai aucun contrôle sur les requêtes, mais je dois m'assurer qu'elles ne s'exécutent pas au-delà d'une limite de temps fixée. J'ai essayé d'utiliser signal.SIGALRM pour interrompre l'appel à l'exécution, mais cela ne semble pas fonctionner. Le signal est envoyé, mais n'est pas pris en compte avant la fin de l'appel à l'exécution.
J'ai écrit un cas de test pour prouver ce comportement :
#!/usr/local/bin/python2.6
import time
import signal
from somewhere import get_dbc
class Timeout(Exception):
""" Time Exceded """
def _alarm_handler(*args):
raise Timeout
dbc = get_dbc()
signal.signal(signal.SIGALRM, _alarm_handler)
signal.alarm(1)
try:
print "START: ", time.time()
dbc.execute("SELECT SLEEP(10)")
except Timeout:
print "TIMEOUT!", time.time()'
Le "SELECT SLEEP(10)" simule une requête lente, mais je constate le même comportement avec une requête lente réelle.
Le résultat :
START: 1254440686.69
TIMEOUT! 1254440696.69
Comme vous pouvez le voir, il dort pendant 10 secondes, puis j'obtiens l'exception Timeout.
Questions :
- Pourquoi ne reçois-je le signal qu'après la fin de l'exécution ?
- Existe-t-il un autre moyen fiable de limiter le temps d'exécution des requêtes ?