2016-07-13 6 views
0

Ich muss eine Funktion mehrmals auf verschiedenen Eingaben anwenden. Manchmal dauert die Ausführung der Funktion Stunden. Ich will nicht, dass es länger als 10 Sekunden dauert. Ich habe die Methode in einem früheren Post gefunden (How to limit execution time of a function call in Python). Ich kann es benutzen, aber sobald es fertig ist, stirbt mein Kernel (unerwartet). Sie finden unten ein Beispiel.Begrenzung der Ausführungszeit eines Funktionsaufrufs in Python tötet meinen Kernel

Hat jemand dieses Problem/weiß warum es passiert?

Fyk: Ich benutze Spinne (Python 2.7.11 64bits, Qt 4.8.7, PyQt4 (API v2) 4.11.4 auf Darwin)

import signal 
import time 


def signal_handler(signum, frame): 
    raise Exception("Timed out!") 

for i in range(10): 
    signal.signal(signal.SIGALRM, signal_handler) 
    signal.alarm(10) # Ten seconds 
    try: 
     time.sleep(0.2) # The function I want to apply 
     print("Ok it works") 
    except Exception, msg: 
     print "Timed out!" 

Antwort

1

Sie erstellen 10 Signale mit SIGALRM Handler, bedeutung Sie haben jetzt 10 Ausnahmen zur gleichen Zeit. Vielleicht möchten Sie stattdessen versuchen:

signal.signal(signal.SIGALRM, signal_handler) 
signal.alarm(10) # Ten seconds 

for i in range(10): 
    try: 
     time.sleep(0.2) # The function I want to apply 
     print("Ok it works") 
    except Exception, msg: 
     print "Timed out!" 
     break 

Oder Sie schließen den Alarm nach dem Signal betrachten möchte, sollte vollständig sein:

for i in range(10): 
    signal.signal(signal.SIGALRM, signal_handler) 
    signal.alarm(10) # Ten seconds 
    try: 
     time.sleep(i * 2) # Force it to break, 
     print("Ok it works") 
    except Exception, msg: 
     print "Timed out!" 
    signal.alarm(0) 
+0

Tks für Ihre Antwort. Ich wusste nicht, dass ich mein Signal schließen musste. Alarm! Ich möchte jedoch den Alarm innerhalb der Schleife. Aber wenn ich es schließe, funktioniert es! –