2016-07-02 13 views
0

Ich möchte einen Timer erstellen, so dass eine bestimmte Codezeile nur 60 Sekunden verarbeitet werden muss.Nur eine bestimmte Anzahl von Sekunden für eine Zeile von Python

def foo():

for i in xrange(10): 
     output = action(arg1, arg2) 
     print i 

Wenn diese Aktion mehr als 60 Sekunden dauert, dann nicht gedruckt i, sondern einfach weiter zu nächsten. Wie kann ich das machen?

Aktion ist keine Schleife, daher funktioniert der Timer nicht. Ich habe auch versucht Signal, aber das funktioniert auch nicht, weil ich diese verschachtelte Innenschleifen habe und ich bekomme einen Fehler, der sagt: ValueError: Signal funktioniert nur im Haupt-Thread // Werkzeug Debugger.

Hier ist, was ich mit Signalen versucht haben, so weit und die Fehler, die ich erhalten:

fileName.py

class TimeoutException(Exception): 
    pass 
def timeout_handler(signum, frame): 
    raise TimeoutException 
signal.signal(signal.SIGALRM, timeout_handler) 

def foo(): 
    signal.alarm(60)  
    try: 
     output = foo2(arg1, arg2) 
    except TimeoutException: 
     continue 
    else: 
     # Reset the alarm 
     signal.alarm(0) 

ich dies tun und stattdessen die Ausnahme zu heben, die nur dann passieren sollte schließlich weiter Mit meiner Operation bekomme ich das und das Skript endet.

Linie X in timeout_handler

Erhöhung Timeout

fileName.TimeoutException

Antwort

0
import time 
for i in xrange(10): 
    time_start = time.time() 
    output = action(arg1, arg2) 
    if time.time() - time_start <= 60: 
     print i 
+0

Es ist nicht von Ihrer ursprünglichen Problemstellung scheint, die Sie benötigen, eine Ausnahme zu erhöhen, wenn die Funktion Aufruf zum Handeln dauerte mehr als 60 Sekunden. Ich habe nur verglichen, wie die Aussage mit einem Gleichheitsunterschied ausging. Wenn es länger als 60 Sekunden war, wird die Schleifenvariable nicht gedruckt. es macht einfach weiter, was es getan hat. – Joe

+0

hey Joe, in dem Code, den Sie zur Verfügung gestellt haben, ist output = action (arg1, arg2) etwas, das nur 1 Sekunde oder bis zu 2 Minuten dauern könnte. Wenn es länger als 60 Sekunden dauert, möchte ich diese Aktion beenden und mit der nächsten Aktion fortfahren. – user3781365

+0

Entschuldigung bedeutete 2 Stunden * – user3781365