Unterbrechen einer Endlosschleife nach einer Zeit X

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.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Montag 26. Mai 2008, 17:09

Hallo Leute!

Ich lesen mit meinem Programm mehrere Textfiles ein - bei manchen (wenigen)
hängt sich das Programm allerdings auf und läuft quasi ewig. Wie kann ich so etwas abfangen?

Ich hab es in Analogie dazu mal mit einer konstruierten Endllosschleife versucht,
die ich nach einer bestimmten Zeit (z.B. 10 sec.) durchbrechen möchte.

...mit meiner while Schleife geht ' s leider nicht.

Code: Alles auswählen

#timeout.py

from time import*
import sys
import os

count =1

timer = time()
timer_max = timer + 5

while timer < timer_max:
	while True:
	
		count = count +1
		print count	
Hat jemand von Euch eine Idee, wie man nach der Zeit x in eine exeption kommen kann?

Besten Dank!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 26. Mai 2008, 17:37

Dass sich bei deiner Beispielschleife nichts tut, liegt daran, dass die Bedingung von Anfang wahr ist und sich daran auch nichts mehr ändert - du produzierst eine Endlosschleife.

Wenn ich dich recht verstehe, willst du das hier:

Code: Alles auswählen

from time import time

t0 = time()
delta = 5
counter = 0
while time()-t0<delta:
    counter += 1
print counter
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Montag 26. Mai 2008, 17:52

while timer < timer_max:
würde dauernd zb 1211820314 mit 1211820319 vergleichen. Aber ein Wert soll ja die aktuelle Zeit sein, also musst du ``time.time()`` benutzen.
Achja, man sollte keine ``from modul import *`` benutzen. Also keine Sternchen ;)
``import time`` tut's auch erstmal :)
lunar

Montag 26. Mai 2008, 18:35

Endlos-Schleife in Hintergrund-Threads verschieben... das ist gut, das muss ich mir merken ;)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 26. Mai 2008, 18:39

Solltest du nich rausfinden, warum die Schleife nicht terminiert? Für mich hört sich das so an, als wenn du ein Problem beim Lesen/Auswerten der Textfiles hast und jetzt da irgendwie ein Lösung drum herum basteln willst.
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Montag 26. Mai 2008, 19:24

Für die Auswertung der Files binde ich ein komerzielles Programm via Systemcall ein - Bei den Textdateien handelt es sich um Kristallstrukturen ca. 6000 (als Flat File).

Das Programm ist ziemlich sensibel, was die Qualität der Textfiles angeht - zum größten Teil schaffe ich es auch evtl. Fehler herauszuparsen

--wenn's bei einer mal nicht funktioniert ist das nicht weiter schlimm, es wäre nur gut wenn das Programm bis zum Ende durchläuft.

Woraus schlussendlich eine Endlosschleife resultiert bleibt für mich eine Blackbox....

Das Ganze soll nur einer von mehreren Sicherungen sein
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 26. Mai 2008, 21:52

lunar hat geschrieben:
Endlos-Schleife in Hintergrund-Threads verschieben... das ist gut, das muss ich mir merken ;)
Die kann man im Zweifelsfall dann terminieren, wenn mich mein altes Doku-Gedächtnis nicht täuscht.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Mai 2008, 00:22

Dann bin ich mal gespannt wie du in Python Threads terminierst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Dienstag 27. Mai 2008, 10:23

AFAIK gibt's in der C-API von Python eine Möglichkeit Threads zu töten und da sollte man mit `ctypes` doch heran kommen können. :twisted:

Sollte man natürlich nicht machen, denn es ja einen Grund das man das nicht offiziell machen kann.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Mai 2008, 10:36

Geht auch ohne ctypes, macht das aber immer noch nicht zu einer guten Idee.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dienstag 27. Mai 2008, 15:46

Also ums sauber zu machen sollte man Breakpoints einbauen und dort die Zeit checken...
lunar

Dienstag 27. Mai 2008, 18:33

audax hat geschrieben:
lunar hat geschrieben:
Endlos-Schleife in Hintergrund-Threads verschieben... das ist gut, das muss ich mir merken ;)
Die kann man im Zweifelsfall dann terminieren, wenn mich mein altes Doku-Gedächtnis nicht täuscht.
Man, dass war ein Scherz ;) Ich fand es halt komisch, dass du auf eine ``while True:``-Schleife ohne Abbruchbedingung mit einem Link auf das Threading-Modul geantwortet hast ;)

Ob nun Abbruchbedingungen die Lösung zur Terminierung von Hintergrundthreads sind, sei mal dahingestellt. Das lässt den Code anwachsen und außerordentlich hässlich aussehen. Zudem wirken solche Abbruchbedingungen nicht in IO-Operationen, ein Hintergrund-Thread, der ``urllib.urlopen('foo').read()`` ausführt und unglücklicherweise einen 2 GiB großen Response erhält, lässt sich auch nicht mit if-Abfragen töten ;)

Da ist kooperatives Multitasking, wie Qt4 oder Twisted mit Ereignisschleifen machen, schon besser ;)

@Leonidas
Uhm? Ist das ein Firefox-Bug, dass bei mir da ``import ctypes`` und "it needs ctypes installed" steht?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Mai 2008, 22:33

lunar hat geschrieben:Uhm? Ist das ein Firefox-Bug, dass bei mir da ``import ctypes`` und "it needs ctypes installed" steht?
Übersehe ich da gerade einen Widerspruch? Wenn man Python 2.4 hat dann muss man ctypes installieren, das will der Autor des Postings wohl deutlich machen. Oder meinst du gar etwas anderes? Du bist ja schlau genug zu wissen, dass man ctypes braucht, wenn man es importiert, aber wer weiß was der Autor für eine Leserschaft sonst so hat? ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Dienstag 27. Mai 2008, 22:48

@Leonidas: Du verlinkst etwas mit dem Satz "Geht auch ohne ctypes", das sehr wohl `ctypes` verwendet!? Und siehst jetzt keinen Widerspruch!? Ich bin verwirrt…
Antworten