While-Schleife nach bestimmter Zeit abbrechen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
idontknowwho
User
Beiträge: 3
Registriert: Donnerstag 13. August 2020, 14:47

Hi,

Ich habe eine while-Schleife in meinem Programm und würde gerne wissen wie man die nach einer bestimmten zeit wieder abbrechen kann. Ich weiß dass diese Frage schon überall mal gestellt wurde, die Lösung funktioniert aber nur wenn der aktuelle Schleifendurchlauf schon zu Ende ist. Hier mal ein Beispiel von dem was ich meine: https://stackoverflow.com/questions/132 ... nt-of-time
Wenn man dort (egal bei welcher Lösung) z. B. ein time.sleep(5) in die while-Schleife packt, dann wartet der Timer erst bis der aktuelle Schleifendurchlauf beendet ist. Ich möchte also wissen, wie die Schleife beenden kann, während die Schleife noch am laufen ist.

Danke im Voraus.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Beschreibe dein Problem genauer. Was möchtest du konkret nach einer gewissen Zeit abbrechen. Zeige den Code den du schon hast.
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn mit "zu einem bestimmten Zeitpunkt" ein bestimmter Zeitpunkt gemeint ist (wie 18.8.2020 19.06 Uhr), dann muss du als Bedingung beim `while` halt einen Zeitvergleich machen. Das ist vom Prinzip her in dem SO Thread auch erklärt. Das `time.sleep` ist da in den Beispielen drin, um damit die CPU aufgrund einer rasend schnellen, trivialen while-Schleife nicht im Dauerstress ist.

Gruß, noisefloor
Geralonx
User
Beiträge: 10
Registriert: Dienstag 18. August 2020, 09:23

Wenn ich dich richtig verstanden habe, dann möchtest du beispielsweise nach 5 Minuten die Schleife beenden. Unabhängig von der Anzahl der Durchläufe. Einfach nur x Sekunden nach Beginn der Schleife?

Code: Alles auswählen

import datetime

t_max=60.0 # in Sekunden
t_start = datetime.datetime.now()

while (datetime.datetime.now()-t_start).total_seconds()<t_max:
    # Code

    
Jedesmal wenn die Schleife durchlaufen ist wird die Bedingung abgefragt. Die Bedienung ist, ob der aktuelle Zeitpunkt abzüglich dem zuerst gesetzten Zeitpunkt kleiner als deine gesetzte Maximalzeit ist. Wenn ja, dann wird ein neuer Durchlauf begonnen.
Wenn man zwei Datetime Objekte voneinander abzieht muss man die resultierende Differenz mit .total_seconds() in eine float umwandeln, um anschließend den Vergleich durchzuführen
Natürlich bringt dir so eine Abfrage nichts, wenn dein Code in der Schleife schon deutlich länger braucht als deine maximale Zeit.


EDIT: Es ist spät und ich hab nicht aufmerksam gelesen. Du möchtest die Schleife ja abbrechen, wenn sie noch läuft. Dazu wäre es wirklich interessant und nötig zu wissen, was in der Schleife läuft.
AMD Ryzen 7 3700X
Gigabyte Nvidia Gefroce RTX 2070 Super Windforce OC
Gigabyte X570 Aorus Elite AMD
HyperX Savage DDR4-2400 2*8192MB

Win10 64 Bit (10.0.19041)
VSCode 1.48
Python 3.8.4 64-Bit
Tensorflow 2.2.0 (GPU)
CUDA 10.1
CUPTI 10.0
cuDNN v8.0.2

Stand: 18.08.2020
Geralonx
User
Beiträge: 10
Registriert: Dienstag 18. August 2020, 09:23

Wenn du wirklich eine Schleife nach einer bestimmten Zeit abbrechen willst und das unabhängig davon, wo man sich gerade in der Schleife aufhält, dann fallen mir nur Möglichkeiten mit Multithreading/Multiprocessing ein. Das wäre aber sehr wahrscheinlich völliger Overkill. Theoretisch aber machbar.

Grüße und gute Nacht jetzt :?
AMD Ryzen 7 3700X
Gigabyte Nvidia Gefroce RTX 2070 Super Windforce OC
Gigabyte X570 Aorus Elite AMD
HyperX Savage DDR4-2400 2*8192MB

Win10 64 Bit (10.0.19041)
VSCode 1.48
Python 3.8.4 64-Bit
Tensorflow 2.2.0 (GPU)
CUDA 10.1
CUPTI 10.0
cuDNN v8.0.2

Stand: 18.08.2020
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@Geralonx: Das kann man mit Threads lösen, aber auch die würgt man nicht brutal ab. Man verlagert nur das Problem, wenn man das tut.

Idontknowhow wird sein ursprüngliches Problem erklären müssen, denn das, was er für die Lösung hält, ist die falsche.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Geralonx: deine Schleife ist anfällig darauf, dass such die Systemzeit nicht ändert: Sommer- auf Winterzeit, Schaltsekunde, oder sonstige Änderungen. Statt datetime nimmt man für solche Fälle time.monotonic.
Antworten