2012-04-02 5 views
0

Ich habe den folgenden Code in einem Python-Modul; Es verwendet den Subprozess zum Starten einer Befehlszeilen-App und liest die Ausgabe, die die App in stdout schreibt.Wie führe ich einen verzögerten Prozess-Timeout beim Aufruf von Django?

Wenn die Befehlszeilen-App nicht nach 15 Sekunden abgeschlossen ist, möchte ich, dass der Code Timeout. Ich habe signal.alarm verwendet, um dies zu erreichen.

Wenn Sie das Modul ohne Django testen, wird es wie erwartet nach 15s ablaufen. Wenn ich den Code aus einer Django-Ansicht heraus aufruft, wird er jedoch nicht nach 15 Sekunden ablaufen, sondern läuft weiter, bis der erzeugte Prozess abläuft.

Wie kann ich das tun, was ich will?

p = get_process() # spawns a process using subproccess and returns the process handle 

signal.signal(signal.SIGALRM, alarm_handler)       
signal.alarm(15) 
try: 
    s= p.stdout.read() 
except: 
    p.kill() 
    s = "Operation timed out" 
+3

Vielleicht Django läuft Ihren Code in einem bestimmten Thread? Der Interrupt wird immer im Hauptthread auftreten, der möglicherweise nicht Ihr Code ist. –

Antwort

1

This approach, nur einen Thread zum Ausführen des Subprozesses hervorzubringen und ein Timeout beim Verbinden des Threads zu verwenden, sollte Probleme mit Interrupts vermeiden, die im falschen Thread auftreten und auch unter Windows funktionieren.

0

Betrachten select() call mit dem Sie ein Timeout für die E/A-Operation (en) angeben kann.

+1

Denken Sie daran, dass die Verwendung von 'select()' mit Pipes für umgeleitete I/O nur auf UNIX-ähnlichen Systemen funktioniert und unter Windows nicht funktioniert, wobei 'select()' nur auf Sockets funktioniert. Dies könnte oder könnte kein Problem sein (in der Frage wurde kein Betriebssystem angegeben). –

Verwandte Themen