python MySQLDB délai d'expiration de requête

Je suis en train de faire respecter une limite de temps sur des requêtes en python MySQLDB. J'ai une situation où je n'ai pas de contrôle sur les requêtes, mais il faut s'assurer qu'ils ne courent pas sur une limite de temps. J'ai essayé d'utiliser le signal.SIGALRM pour interrompre l'appel à l'exécution, mais cela ne semble pas fonctionner. Le signal est envoyé, mais n'a pas pris jusqu'à après l'appel pour exécuter les finitions.

J'ai écrit un cas de test pour le 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()'

Les "SÉLECTIONNER" SLEEP(10)" est la simulation d'une requête lente, mais je ne vois le même comportement avec un effectif de requêtes lentes.

Le Résultat:

START:   1254440686.69
TIMEOUT! 1254440696.69

Comme vous pouvez le voir, il dort pendant 10 secondes puis-je obtenir de l'Exception Délai.

Questions:

  1. Pourquoi ne puis-je pas obtenir le signal jusqu'à ce que après l'exécution des finitions?
  2. Est-il un autre moyen fiable pour limiter les temps d'exécution requête?
InformationsquelleAutor mluebke | 2009-10-01