2013-02-17 12 views
15

Ich möchte foo(n) anrufen aber stoppen Sie es, wenn es für mehr als 10 Sekunden läuft. Was ist ein guter Weg, dies zu tun?Stop-Code nach Zeitraum

Ich kann sehen, dass ich theoretisch foo selbst ändern könnte, um regelmäßig zu überprüfen, wie lange es gelaufen ist, aber ich würde es vorziehen, das nicht zu tun.

+1

Was hast du in 'foo'? Ist es eine Schleife? Wirst du 'foo' als einen anderen Thread laufen lassen? – ATOzTOA

+0

Ich würde wirklich in Betracht ziehen, 'foo' zu modifizieren, aber ansonsten diese Frage sehen: http://StackOverflow.com/questions/492519/timeout-on-a-python-function-call oder diese: http://StackOverflow.com/questions/4158502/python-kill-or-terminate-subprocess-wenn-timeout –

+0

@ATOzTOA Es ist ein komplizierter Stück Code, der eine komplizierte Berechnung durchführt. Ich habe diesen Code nicht geschrieben. – felipa

Antwort

24

Hier gehen Sie:

import multiprocessing 
import time 

# Your foo function 
def foo(n): 
    for i in range(10000 * n): 
     print "Tick" 
     time.sleep(1) 

if __name__ == '__main__': 
    # Start foo as a process 
    p = multiprocessing.Process(target=foo, name="Foo", args=(10,)) 
    p.start() 

    # Wait 10 seconds for foo 
    time.sleep(10) 

    # Terminate foo 
    p.terminate() 

    # Cleanup 
    p.join() 

Diese 10 Sekunden für foo warten und es dann töten.

aktualisieren

den Prozess beenden nur, wenn er ausgeführt wird.

# If thread is active 
if p.is_alive(): 
    print "foo is running... let's kill it..." 

    # Terminate foo 
    p.terminate() 

Update 2: Empfohlene

Verwenden join mit timeout. Wenn foo vor dem Timeout beendet wird, kann main fortfahren.

# Wait a maximum of 10 seconds for foo 
# Usage: join([timeout in seconds]) 
p.join(10) 

# If thread is active 
if p.is_alive(): 
    print "foo is running... let's kill it..." 

    # Terminate foo 
    p.terminate() 
    p.join() 
+0

Danke! Ich möchte den Prozess idealerweise nur dann beenden, wenn er nicht bereits beendet ist. Gibt es eine Möglichkeit, dies zu überprüfen? – felipa

+0

@felipa Ja, überprüfen Sie meine aktualisierte Antwort ... – ATOzTOA

+0

Vielen Dank (obwohl 'Timeout' nicht in Ihrer Antwort erscheint). Dies ist sehr hilfreich und informativ. Wenn jemand diese Frage jemals auf den Kopf stellt (die verknüpften Fragen haben keine so brauchbaren Antworten, wie es scheint), werde ich Sie natürlich auf den neuesten Stand bringen. Ich kann es momentan nicht sehen. – felipa

2
import signal 

#Sets an handler function, you can comment it if you don't need it. 
signal.signal(signal.SIGALRM,handler_function) 

#Sets an alarm in 10 seconds 
#If uncaught will terminate your process. 
signal.alarm(10) 

Der Timeout ist nicht sehr präzise, ​​aber tun können, wenn Sie extreme Präzision nicht brauchen.

Eine andere Möglichkeit besteht darin, das Modul Ressource zu verwenden und die maximale CPU-Zeit einzustellen.

+0

Was können Sie dieses etwas erweitern, um zu zeigen, wie es die Funktion 'foo' beendet und nicht zum Beispiel das ganze Python-Skript? Ich möchte, dass mein Skript weiterläuft, nur um nach 10 Sekunden auf "foo" zu reagieren. – felipa

+0

Schreiben Sie dazu einen Funktionshandler, z. B. in jede Iteration der Funktionsüberprüfung für eine globale Variable, und ändern Sie diese Variable im Signalhandler. – LtWorf

+0

@LtWorf OP sagte bereits die Funktion ist eine komplexe und nicht eine einzige Schleife. Also, das wird nicht funktionieren. – ATOzTOA

Verwandte Themen