Pythonscript in Endlosschleife betreiben

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
Korbi_et_Orbi
User
Beiträge: 3
Registriert: Mittwoch 6. Juli 2011, 18:53

Hallo,
ich bin gerade dabei ein Script für die
Überwachung eins "Hotfolders zu
schreiben. Das Script sollte sich am
Ende des Codes wieder von vorne starten.
natürlich könnte man dies mit einer while-Schleife
lösen, deren Bedingung immer wahr ist.
Aber gibt es eine elegantere Methode dafür?

Danke und Gruß,
K
BlackJack

@Korbi_et_Orbi: Das ist eine einfache, naheliegende Umsetzung. Was ist daran nicht elegant genug?
Lopt
User
Beiträge: 9
Registriert: Freitag 11. März 2011, 09:36

Ich schätze es hängt damit zusammen, das eine dauerhaft laufende while Schleife auch dauerhaft Ressourcen verbraucht.
Und die CPU Auslastung dann stets auf 100% ist.

Bau dazu ein (kleines) time.sleep in die while Schleife ein, ein paar ms sollten reichen - sofern du nichts zu aufwendiges machst.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Oder du nimmst halt irgendwas Ereignisbasiertes, so dass du auf das andauernde Polling verzichten kannst. Mit INotify lassen sich unter Linux beispielsweise Dateien und Verzeichnisse beobachten.

Eine weitere Alternative sind Timeouts; wenn du beispielsweise GTK benutzt, möchtest du vll. gobject.timeout_add() nutzen, um deinen "Hotfolder" alle x Sekunden zu überprüfen. Die Lösung hat den Vorteil, dass du keine zusätzlichen Threads benötigst und somit Probleme mit der GUI vermeidest.

Was wann "eleganter" ist, ist dann aber tatsächlich von vielen Faktoren abhängig. INotify gibt es bspw. nur für Linux - für Windows müsstest du Alternativ-Code schreiben. Die while-Variante kann je nach Implementierung entweder zu ressourcenfressend (kein time.sleep()) oder zu langsam (zu große Timeouts durch time.sleep()) sein. So ganz allgemein lässt sich das mMn nicht beantworten.

Besten Gruß,

brb
Korbi_et_Orbi
User
Beiträge: 3
Registriert: Mittwoch 6. Juli 2011, 18:53

Danke für die Antworten. Schon nach zwei Tagen schätze ich
dieses Forum sehr.
Lopt hat geschrieben:Ich schätze es hängt damit zusammen, das eine dauerhaft laufende while Schleife auch dauerhaft Ressourcen verbraucht.
Und die CPU Auslastung dann stets auf 100% ist.

Bau dazu ein (kleines) time.sleep in die while Schleife ein, ein paar ms sollten reichen - sofern du nichts zu aufwendiges machst.

Ich denke, dass die while-Variante durchaus ausreichend ist, was ich jedoch nicht ganz verstehe ist die Funktion "time.sleep", vor allem wenn
das Programm nur für ein paar ms eingefroren wird. Was bezweckt das? Dass die CPU-Auslastung kurzzeitig sinkt? Was hat dies in dieser kurzen
Zeitspanne zum Vorteil?

Danke!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

"sleep" sagt nur das der CPU in der angegebenen Zeit den Prozess nicht weiter fortsetzen soll. Sonst würde die Schleife so oft durchlaufen wie die Geschwindigkeit des CPU es nun mal zulässt und das wären dann halt 100% eines Kernes, solange du nicht noch multithreading/process nutzt. Finde ich nun keine optimale Lösung, wenn das Programm aus wasfür einem Grund auch immer abschmiert wird der "Hotfolder" nicht mehr überwacht. Eventuell würde sich aber ein Cron Job anbieten. Dann kannst du das Script bspw. alle 5 Min. einmal ausführen lassen und brauchst auch keine Schleife mehr. Kommt natürlich darauf an wie häufig du das ausführen musst, wenn es mehrmals in einer Minute ausgeführt werden muss dann funktioniert es mit Cron natürlich nicht.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
deets

Korbi_et_Orbi hat geschrieben: Was bezweckt das? Dass die CPU-Auslastung kurzzeitig sinkt? Was hat dies in dieser kurzen
Zeitspanne zum Vorteil
Was fuer dich eine kurze Zeitspanne ist, ist fuer deinen Prozessor eine Aeone. Kannst ja einfach mal ein simples Test-Skript schreiben:

Code: Alles auswählen

while True: pass
und

Code: Alles auswählen

import time
while True: time.sleep(.1)
Und mal schauen, was das mit deiner Prozessorlast macht....
Antworten