2017-02-19 15 views
2

Ich arbeite daran, einen Haufen Dreiecke mit speziellen Eigenschaften für einen Number Theorist-Freund zu berechnen. Es gibt unendlich viele dieser Dreiecke, aber sie benötigen viel Rechenleistung, um sie zu finden.Benutzereingabe zum Abbrechen der Endlosschleife?

Wir haben eine Endlosschleife, die durch verschiedene b, d Kombinationen läuft. Wenn das Programm endet, ruft es die Funktion go (dict) auf, um die gefundenen Dreiecke zu exportieren. Momentan teilen wir dem Programm zu Beginn mit, in welchem ​​Intervall es laufen soll. Dies verursacht Probleme, wenn wir erkennen, dass wir die Rechenleistung für etwas anderes benötigen, aber das Programm hat noch Stunden zu laufen und wir wollen die Dreiecke, die es bereits berechnet hat, nicht verlieren, indem wir das Programm verlassen ohne go (dict) zu laufen.

Idealerweise möchten wir, dass eine Benutzereingabe das Programm veranlasst, die Schleife zu unterbrechen. Führen Sie (dict) mit der aktuellen Version des Wörterbuchs, das im Speicher gehalten wird, aus und beenden Sie es. Der Versuch mit atexit.register (go, dict) war nicht erfolgreich, da es oft innerhalb der Schleife aufgerufen wird und oft ausgeführt wird, wenn das Programm beendet wird.

(Siehe den abgekürzten Schleife Code unten)

interval = eval(input("How many hours shall I run for? "))*3600 
starttime = time.time() 
dict = {} 
b = start_value 
while True: 
    for d in range (1, b): 
     compute stuff 

     if (condition): 
      add triangle to dict 

    if (time.time()-starttime)>interval: 
     go(dict) 
     return 
    b +=1 
+0

Welches Betriebssystem verwenden Sie? – martineau

Antwort

4

Dies ist, was Ausnahmen sind, können verwendet werden für: Sie drücken Sie Strg + C, um den Prozess zu unterbrechen, und Ihr Code behandelt sie durch die Ergebnisse zu speichern:

while True: 
    try: 
     # your code here 
    except KeyboardInterrupt: 
     go(dict) 
     break 

Hinweis, dass man nicht return von einer eigenständigen Schleife, aber man kann break von ihm aber nicht.

+0

Danke für die klare und prägnante Antwort. Sie haben Recht mit dem Bruch, aber wir suchen nach einem Einhorn unter den speziellen Dreiecken, also ist die Rückkehr für die Funktion, die die Schleife hält (im Wesentlichen die Suche aufhebend), da es Code gibt, der der Schleife folgt, um nur zu sein ausgeführt, sobald das von uns gesuchte Einhorn-Dreieck gefunden wurde. –

1

eine Sache, die Sie tun können, ist except KeyboardInterrupt: mit Strg + c übernehmen, wenn Sie einen Interrupt an das Skript sendet es diesen Block, in dem Sie laufen setzen können Code zu verlassen sauber hier ein Beispiel:

i = 0 
try: 
    while True: 
     i+=1 
except KeyboardInterrupt: 
    print 'caught INT' 
    print i 
1

unter Verwendung von Signalen:

import signal 
interrupted = False # Used to break the loop when we send SIGINT 

# When SIGINT is received, set interrupted to True 
def signal_handler(signal, frame): 
    global interrupted 
    interrupted = True 

# Sets signal_handler to run if a SIGINT was received 
signal.signal(signal.SIGINT, signal_handler) 

interval = eval(input("How many hours shall I run for? "))*3600 
starttime = time.time() 
dict = {} 
b = start_value 
while True: 
    for d in range (1, b): 
     compute stuff 

     if (condition): 
      add triangle to dict 

     if (time.time()-starttime)>interval: 
      go(dict) 
      break 

     if interrupted: 
      go(dict) 
      break 
    b +=1 

Wenn wir jetzt ctrl+c treffen, setzen wir interrupted-True die go(dict) läuft und bricht die Schleife.

+1

Gute Referenz für Leute, die in Zukunft hierher kommen! –

Verwandte Themen