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.
While-Schleife nach bestimmter Zeit abbrechen
- noisefloor
- User
- Beiträge: 4193
- 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
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
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?
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.
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
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
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
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
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
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: 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.
Idontknowhow wird sein ursprüngliches Problem erklären müssen, denn das, was er für die Lösung hält, ist die falsche.