2010-05-14 5 views
15

Sorry, das ist wahrscheinlich eine schreckliche Frage. Ich habe JUST begann Python heute lernen. Ich habe ein Byte von Python gelesen. Im Moment habe ich ein Projekt für Python, das Zeit benötigt. Ich kann nichts in Bezug auf die Zeit in Byte von Python finden, also werde ich Sie fragen:Ausführen eines Python-Skripts für einen benutzerdefinierten Zeitraum?

Wie kann ich einen Block für einen benutzerdefinierten Zeitraum ausführen und dann brechen?

Zum Beispiel (in einigen Pseudo-Code):

time = int(raw_input('Enter the amount of seconds you want to run this: ')) 
while there is still time left: 
    #run this block 

oder noch besser:

import sys 
time = sys.argv[1] 
while there is still time left: 
    #run this block 

Vielen Dank für jede Hilfe. Auch zusätzliche Online-Anleitungen und Tutorials würden sehr geschätzt werden. Ich mag Byte of Python sehr. Eintauchen in Python kann meine Aufmerksamkeit allerdings nicht ganz halten. Ich nehme an, ich sollte es durchmachen und versuchen, es noch besser zu lesen.

Antwort

16

Ich empfehle, einen anderen thread, so dass es ein daemon thread, dann sleeping laichen, bis Sie möchten, dass die Aufgabe zu sterben. Beispiel:

from time import sleep 
from threading import Thread 

def some_task(): 
    while True: 
     pass 

t = Thread(target=some_task) # run the some_task function in another 
           # thread 
t.daemon = True    # Python will exit when the main thread 
           # exits, even if this thread is still 
           # running 
t.start() 

snooziness = int(raw_input('Enter the amount of seconds you want to run this: ')) 
sleep(snooziness) 

# Since this is the end of the script, Python will now exit. If we 
# still had any other non-daemon threads running, we wouldn't exit. 
# However, since our task is a daemon thread, Python will exit even if 
# it's still going. 

Der Python-Interpreter wird heruntergefahren, wenn alle Nicht-Daemon-Threads beendet wurden. Wenn also der Hauptthread beendet wird und der einzige andere laufende Thread Ihre Aufgabe ist, die Sie in einem separaten Daemon-Thread ausführen, wird Python einfach beendet. Dies ist eine praktische Möglichkeit, etwas im Hintergrund auszuführen, wenn Sie nur beenden möchten, ohne sich darum sorgen zu müssen, dass es manuell beendet wird und darauf wartet, dass es aufhört. Der Vorteil, den dieser Ansatz gegenüber der Verwendung von sleep in einer for-Schleife hat, ist in diesem Fall, dass Sie Ihre Aufgabe so codieren müssen, dass sie in einzelne Blöcke aufgeteilt wird und dann von Zeit zu Zeit überprüft, ob Deine Zeit ist abgelaufen. Was für Ihre Zwecke in Ordnung sein kann, aber es kann Probleme haben, zB wenn jeder Chunk viel Zeit in Anspruch nimmt, was dazu führt, dass Ihr Programm wesentlich länger läuft, als der Benutzer eingegeben hat usw. Ob dies ein Problem für Sie ist hängt von der Aufgabe ab, die du schreibst, aber ich dachte, ich würde diesen Ansatz erwähnen, falls es für dich besser wäre.

+0

Es tut mir leid, können Sie etwas davon kommentieren? Ich habe mich nicht gewagt, zu fädeln und zu schlafen. Was ich unter deiner Antwort verstehe: Wachen aus dem Schlaf bricht der Faden? – Rob

+0

@Rob: Ich habe dem Code mehr Erklärungen und einige Kommentare hinzugefügt. Lassen Sie mich wissen, wenn etwas besonders unklar ist. –

+0

Eigentlich hast du alles klar gemacht. Dies scheint viel effizienter als die Zeit wiederholt zu überprüfen. Danke vielmals – Rob

13

Versuchen Sie time.time(), die die aktuelle Zeit als die Anzahl der Sekunden seit einer festgelegten Zeit Epoch (Mitternacht am 1. Januar 1970 für viele Computer) zurückgibt. Hier ist eine Möglichkeit, es zu benutzen:

import time 

max_time = int(raw_input('Enter the amount of seconds you want to run this: ')) 
start_time = time.time() # remember when we started 
while (time.time() - start_time) < max_time: 
    do_stuff() 

Also werden wir Schleife solange die Zeit, da wir begonnen kleiner als das vom Benutzer festgelegten Maximum. Dies ist nicht perfekt: Vor allem, wenn do_stuff() eine lange Zeit dauert, werden wir nicht aufhören, bis es beendet ist und wir entdecken, dass wir unsere Deadline überschritten haben. Wenn Sie in der Lage sein müssen, eine laufende Aufgabe zu unterbrechen, sobald die Zeit verstrichen ist, wird das Problem komplizierter.

+0

brauche ich die Lage sein, die Aufgabe im Gang zu unterbrechen, eigentlich. Aber wäre das nicht eine einfache Modifikation wie 'if (time.time() - start_time)> max_time: break'? Bitte korrigieren Sie mich, wenn ich falsch liege – Rob

+2

Sicher! Das wird gut funktionieren - Sie müssen nur sicherstellen, dass Sie diesen Test zwischen kleinen Ausführungsabschnitten ausführen. – Etaoin

+0

Vielen Dank, Etaoin! – Rob

4

Wenn Sie auf Linux sind, und Sie wollen einen lang andauernden Prozess zu unterbrechen, verwenden Signal:

import signal, time 

def got_alarm(signum, frame): 
    print 'Alarm!' 

# call 'got_alarm' in two seconds: 
signal.signal(signal.SIGALRM, got_alarm) 
signal.alarm(2) 

print 'sleeping...' 
time.sleep(4) 

print 'done' 
Verwandte Themen