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

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

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

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

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

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

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
BlackJack

@Leonidas: Du verlinkst etwas mit dem Satz "Geht auch ohne ctypes", das sehr wohl `ctypes` verwendet!? Und siehst jetzt keinen Widerspruch!? Ich bin verwirrt…
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Uh, tatsächlich :oops:

Aber hey, ich bin unschuldig, das schiebe ich zu 100% auf Prüfungsstress :D Man, keine Ahnung wie ich das übersehen habe. D'oh!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

okay -- ich glaub ich hab s - Lösung ist zwar nicht toll, funktioniert aber:

Code: Alles auswählen

import os
import time
from time import time

actual_process_id = os.getpid()
print actual_process_id, "ID of current process" 	# id of started process!
print "\n"

t0 = time()				
delta = 100
counter = 0

while True:
	actual_time = time()
	counter = counter+1
	print counter
	print actual_time - t0, "Zeit"
			
	if  (actual_time-t0) > delta: 
		print "killing process "
		os.kill(actual_process_id, 15)
Ich hoffe nur, dass ich es auf mein Problem anwenden kann - in diesem Falle bin ich ja immerhin darauf angewiesen, dass meine Schleife durchläuft.

Wie also verfahren, wenn sich das Programm an einer Stelle einfach aufhängt, die Zeit nicht mehr heruntergezählt wird? Eine zweite (Sub)Shell öffnen und einen Watchdog parallel dazu programmieren der die Zeit korrekt misst?

Kann man sich in python die Zeit ausgeben lassen, wie lange ein Prozess mit der id x =os.getpid() schon läuft?

Mit os.system(top) hätte man so etwas schon fast an der Hand...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Würde aber in der while Schleife ein time.sleep() einbauen ;) Vielleicht mit 0.1 oder höher...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten