10 votes

python MySQLDB query timeout

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 :

  1. Pourquoi ne reçois-je le signal qu'après la fin de l'exécution ?
  2. Existe-t-il un autre moyen fiable de limiter le temps d'exécution des requêtes ?

-1voto

Rafał Dowgird Points 16600

Pourquoi ne reçois-je le signal qu'après la fin de l'exécution ?

Le processus en attente d'E/S réseau est dans un état ininterrompu (un truc UNIX, pas lié à Python ou MySQL). Il reçoit le signal après la fin de l'appel système (probablement en tant que EINTR code d'erreur, mais je n'en suis pas sûr).

Existe-t-il un autre moyen fiable de limiter le temps d'exécution des requêtes ?

Je pense que cette opération est généralement réalisée par un outil externe tel que mkill qui surveille MySQL à la recherche de requêtes longues et les tue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X