Wie am besten Loop implementieren?

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
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

Also ich bin mir sicher, dass es zu dem Thema schon ne Menge gibt, aber per Suchmaschinen findet man zu Schleifen oder Loops einfach nicht das richtige. :wink:

Meine Frage ist folgende: Ich habe ein Script, dass über längere Zeit laufen soll. Während der Laufzeit soll es alle paar Minuten aufwachen und einige Sachen "updaten", also Kram ins Internet schicken und wieder empfangen. Nur weiß ich nicht so recht, was die beste Lösung für so eine Schleife ist. Einfach while True und time.sleep? Oder gibt es da bessere Lösungen?

Danke.
lunar

@jgillich: Ohne weitere Hintergründe, v.a. unter welchen Bedingungen die Anwendung aufwachen soll, kann man schwerlich mehr dazu sagen.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

lunar hat geschrieben:@jgillich: Ohne weitere Hintergründe, v.a. unter welchen Bedingungen die Anwendung aufwachen soll, kann man schwerlich mehr dazu sagen.
Es gibt keine Bedingungen, immer nur nach bestimmter Zeit.

Aber nochmal eine etwas genauere Beschreibung, falls das hilft: Es geht darum Informationen von einer Webseite abzurufen, umgesetzt habe ich das mit Selenium (http://seleniumhq.org/), da es wichtig ist dass die Webseite einen als "normalen" Besucher erkennt.

Jedenfalls habe ich vor, einfach alle paar Minuten die Seite zu öffnen und basierend auf diesen Informationen entweder das Programm wieder schlafen zu legen oder einige Aktionen auszuführen.

Besser? :)

@darktrym: So wie ich das erfasse, starten Timer nur nach einer bestimmten Zeit und wiederholen sich nicht. Könnte die dann zwar immer neustarten, aber das ist glaube ich nicht im Sinne des Erfinders.
BlackJack

@jgillich: Wenn Dein Programm Zustand hat, den es sich über die Webseitenaufrufe hinweg merkt, dann nimm doch einfach eine ``while``-Schleife in Verbindung mit `time.sleep()`. Wenn sich kein Zustand gemerkt werden muss und das Programm dauerhaft regelmässig ausgeführt werden soll, könnte man auch den Dienst des verwendeten Betriebssystems verwenden, der normalerweise für regelmässiges ausführen von Programmen benutzt wird.
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

Doch, ein Zustand muss sich schon gemerkt werden. While und time.sleep() war auch mein erster Gedanke, aber in der Python Doku wird davon mehr oder weniger abgeraten: http://docs.python.org/library/time.html#time.sleep
The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine.
Oder ist das unbedenklich?
Ich plane auch noch eine GTK+-Oberfläche, von daher bin ich mir da unsicher.
Benutzeravatar
snafu
User
Beiträge: 6754
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jgillich hat geschrieben:While und time.sleep() war auch mein erster Gedanke, aber in der Python Doku wird davon mehr oder weniger abgeraten: http://docs.python.org/library/time.html#time.sleep
The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine.
Es geht dabei um Millisekunden...
jgillich hat geschrieben:Ich plane auch noch eine GTK+-Oberfläche, von daher bin ich mir da unsicher.
Bei einer GUI solltest du besser die Timer-Funktionalität des Toolkits verwenden.

Das, was jetzt allmählich zutage tritt, sind übrigens die Hintergründe/Bedingungen, nach denen lunar eingangs gefragt hatte. ;)
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

snafu hat geschrieben:Es geht dabei um Millisekunden....
Oh, ok na dann. :P
snafu hat geschrieben:Bei einer GUI solltest du besser die Timer-Funktionalität des Toolkits verwenden.
Ich habe mich bisher noch nicht so recht entschieden, möglicherweise wirds auch nur Kommandozeilebasiert oder ne Weboberfläche. Werde das dann dementsprechend umstellen.

Danke an alle. :)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ansonsten:

Code: Alles auswählen

interval = 60
wakeup = time.time() + interval
while True:
    now = time.time()
    if now < wakeup:
        time.sleep(wakeup-now)
        continue

    ... do stuff ...

    wakeup += interval 
So gehst du auf nummer sicher, wenn sleep() zu früh aufwacht.
Bottle: Micro Web Framework + Development Blog
Antworten