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
Pythonscript in Endlosschleife betreiben
@Korbi_et_Orbi: Das ist eine einfache, naheliegende Umsetzung. Was ist daran nicht elegant genug?
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.
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.
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
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
-
- 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.
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!
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!
"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.
Was fuer dich eine kurze Zeitspanne ist, ist fuer deinen Prozessor eine Aeone. Kannst ja einfach mal ein simples Test-Skript schreiben:Korbi_et_Orbi hat geschrieben: Was bezweckt das? Dass die CPU-Auslastung kurzzeitig sinkt? Was hat dies in dieser kurzen
Zeitspanne zum Vorteil
Code: Alles auswählen
while True: pass
Code: Alles auswählen
import time
while True: time.sleep(.1)