Mettre un Timeout sur une fonction en python

Je vais vous présenter deux manières de limiter le temps d’éxécution d’une fonction/méthode en python.

La première est très élégante et inspirée de ce site, mais les bugs sont corrigés. Malheureusement dans un cas particulier (l’utilisation d’un wrapper vers des fonctions en C (swiglpk)) cela ne fonctionnait pas et j’ai dû trouver une autre solution.

La solution élégante

En premier lieu vous devez importer le module signal puis créer une nouvelle exception:

Ensuite, il faut créer le décorateur. C’est un peu plus compliqué à comprendre. Le décorateur va créer une alarme puis il va lancer la fonction à laquelle vous l’avez accolé. Si la durée d’éxécution est plus grande que la limite que vous avez définie alors un signal va être lancé par l’alarme. Le handler va récupérer le signal et va lancer une exception qui termine l’éxécution courante jusqu’à la fonction où vous la récupérez. Sinon l’alarme va être réinitialisée et le résultat du calcul de votre fonction va être renvoyé.
Cela ce code ainsi:

Ensuite, ça s’utilise simplement comme ceci :

La solution robuste

En premier lieu vous devez importer Queue et Process du module multiprocessing :

Puis vous pouvez créer la fonction prenant du temps. Au lieu de faire « return resultat » vous devez utiliser queue.put(resultat) et queue doit être un paramètre de votre fonction.

Vous pouvez enfin créer la fonction qui va limiter la durée d’éxécution :

Il est peut être possible de créer un décorateur pour cette solution robuste, mais cela sera difficile à cause de l’utilisation de Queue et du tuple d’arguments de Process devant finir par « , ».

Mettre un Timeout sur une fonction en python par La Réponse est 42 est sous Licence Creative Commons Internationale Attribution-Partage à l'identique 4.0.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *