Seite 1 von 1

Unterbrechen einer Endlosschleife nach einer Zeit X

Verfasst: Montag 26. Mai 2008, 17:09
von acidk
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!

Verfasst: Montag 26. Mai 2008, 17:29
von audax

Verfasst: Montag 26. Mai 2008, 17:37
von numerix
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

Verfasst: Montag 26. Mai 2008, 17:52
von Karl
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 :)

Verfasst: Montag 26. Mai 2008, 18:35
von lunar
Endlos-Schleife in Hintergrund-Threads verschieben... das ist gut, das muss ich mir merken ;)

Verfasst: Montag 26. Mai 2008, 18:39
von EyDu
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.

Verfasst: Montag 26. Mai 2008, 19:24
von acidk
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

Verfasst: Montag 26. Mai 2008, 21:52
von audax
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.

Verfasst: Dienstag 27. Mai 2008, 00:22
von Leonidas
Dann bin ich mal gespannt wie du in Python Threads terminierst.

Verfasst: Dienstag 27. Mai 2008, 10:23
von 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.

Verfasst: Dienstag 27. Mai 2008, 10:36
von Leonidas
Geht auch ohne ctypes, macht das aber immer noch nicht zu einer guten Idee.

Verfasst: Dienstag 27. Mai 2008, 15:46
von audax
Also ums sauber zu machen sollte man Breakpoints einbauen und dort die Zeit checken...

Verfasst: Dienstag 27. Mai 2008, 18:33
von 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?

Verfasst: Dienstag 27. Mai 2008, 22:33
von Leonidas
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? ;)

Verfasst: Dienstag 27. Mai 2008, 22:48
von 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…

Verfasst: Mittwoch 28. Mai 2008, 08:41
von Leonidas
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!

Verfasst: Donnerstag 5. Juni 2008, 14:13
von acidk
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...

Verfasst: Donnerstag 5. Juni 2008, 14:26
von jens
Würde aber in der while Schleife ein time.sleep() einbauen ;) Vielleicht mit 0.1 oder höher...