1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
# Python 2.7
import sys
import threading
from time import clock, sleep
###################################################
def infiniteLoop(x, y, z="toto"):
for i in range (5000000):
sleep(0.1)
###################################################
class Execute(threading.Thread):
def __init__(self, tempsmax, fonc, *args, **kwargs):
threading.Thread.__init__(self)
self.tempsmax = tempsmax
self.fonc = fonc
self.args = args
self.kwargs = kwargs
# initialise le drapeau qui permettra l'arrêt sur demande
self.stopexec=False
def run(self):
"""Lance l'exécution en tâche de fond"""
try:
# mise en place du traçage
sys.settrace(self.trace)
# initialisation du temps d'exécution
self.temps = clock()
# exécution de la fonction demandée avec ses arguments
self.fonc(*self.args, **self.kwargs)
# arrêt du traçage
sys.settrace(None)
except ValueError:
# arrêt du traçage en cas d'exception
sys.settrace(None)
def trace(self, frame, event, arg):
"""méthode appelée à chaque ligne de code Python exécutée"""
if event == 'line':
if self.stopexec or (clock()-self.temps)>self.tempsmax:
raise ValueError (u"Arrêt demandé")
return self.trace
def stop(self):
""" méthode appelée pour arrêter le thread sur demande"""
self.stopexec = True
###################################################
if __name__ == "__main__":
prog = Execute(15, infiniteLoop, 10, 20, z="titi")
prog.daemon = True
prog.start()
t = clock()
prog.join()
print u"Arrêt au bout de", clock()-t, u"sec." |
Partager