Frage zu time.sleep

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
Baltes
User
Beiträge: 4
Registriert: Sonntag 28. Dezember 2014, 17:29

Hallo liebes Forum,
ich habe mich gerade hier angemeldet, weil ich ein Problem mit einem Programm von mir habe und langsam nicht mehr weiter weis.
Vielleicht könnt ihr mir helfen oder meine Vermutung bestätigen.

Kurz zum Rahmen...
Ich habe ein GUI-Programm.
Von dem Programm werden zwei Threads gestartet die verschiedene Aufgaben parallel abarbeiten.

In einem dieser Threads habe ich ein Problem. Dort ist eine For-Schleife in der sich eine Pause mit time.sleep() befindet.
Jetzt habe ich das Problem, dass diese Schleife auf unterschiedlichen Laptops / PCs unterschiedlich lange braucht.
Was eigentlich keinen Sinn macht.

Code: Alles auswählen

for i in range(500):
     Liste.append(neuerWert)
     time.sleep(Variable)
     i += 1
Das ist die For-Schleife.
Vorher und nachher messe ich die Zeit um zu überprüfen wie lange diese Schleife real braucht.
ich habe jetzt schon mehrmals gelesen, dass die Variante time.sleep() sehr ungenau ist und für kleine Zeitspannen nicht wirklich gut funktioniert. Stimmt das?
Wenn ich bei meinem Laptop als Variable .008 nutze. braucht die Schleife 4 Sekunden. Was ja stimmt.
Wenn ich den Wert verdopple, verdoppelt sich auch die Zeit der Schleife. Also alles gut.
Ich habe dieses Programm jetzt auf zwei anderen Laptops getestet und da stimmt dass überhaupt nicht mehr.
Habe es nicht ganz genau getestet aber ist der Wert sehr klein ist die Schleife in Bruchteilen fertig. Ist der Wert kleiner 0.015 dann braucht die Schleife für jeden Wert immer ca. 7,3 Sekunden und ist der Wert größer dann ca. 15,6 Sekunden. Also ob time.sleep() einfach nur in Etappen verwendbar ist.
Kann das am Prozessor liegen? Dass der dieses Modul nicht richtig verwendet oder habt ihr vielleicht noch eine andere Idee?
Kann ich eine Unterbrechung auch anders realisieren?
Hoffentlich könnt ihr mir helfen.


Liebe Grüße
Zuletzt geändert von Anonymous am Sonntag 28. Dezember 2014, 21:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Baltes: so kurze sleeps machen normalerweise keinen Sinn. Die Prozessorzeit wird in viele kleine Scheibchen geschnitten und jeder Prozess will etwas davon abhaben. Mit sleep sagst Du, ich hab grad nichts zu tun, schau später wieder vorbei. Wie wann welcher Prozess Rechenzeit bekommt, regelt das Betriebssystem. Wenn Du wirklich exakte Zeiteinhaltung willst, brauchst Du ein Echtzeitbetriebssystem.
Baltes
User
Beiträge: 4
Registriert: Sonntag 28. Dezember 2014, 17:29

Hallo,
danke für die Antwort.
Ich brauche halt in der Schleife einfach eine kleine Unterbrechung da die Datenmenge sonst einfach explodiert :-D
Habe zwar jetzt eine Variante im Kopf die gehen dürfte, aber etwas umständlicher sein wird.
Also gehen tut sie, habe gestern schon ein Testprogramm geschrieben und dieses geht auf meinem und auf einem Laptop der die Probleme gemacht hat.
An die Variante Echtzeitbetriebssystem habe ich auch schon gedacht, dass es daran liegen könnte und habe da auch schon bisschen was nachgeschaut, aber ist Vista ein RTOS? Weil mein Laptop mit Vista funktioniert ja tadellos.
Habe zwar schon das Internet befragt, aber das was ich gefunden habe, hat mich nicht wirklich schlau gemacht.
Und ich brauche halt ne Variante die OS unabhängig ist und deswegen war meine Frage wegen dem Sleep. Ob ich da irgendwas nicht bedacht habe oder ihr eine andere Idee habt.

MfG
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Baltes: ich fürchte Du machst da etwas ziemlich häßliches und sleep ist nicht die Lösung. Kannst Du Deine Aufgabe etwas genauer beschrieben bzgl. explodierenden Datenmengen.
BlackJack

@Baltes: Ich denke mal so „out of the box” ist aus der Windows-Familie nur Windows CE ein RTOS. Eben wie die meisten RTOS für kleinere, speziellere Hardware als ein Desktop-PC. RTOS findet man üblicherweise im Embedded-Bereich bei Hardware für's Messen, Steuern, Regeln — eben da wo man Echtzeitanforderungen hat. Eher nicht bei grossen, sehr allgemeinen Betriebssystemen mit GUI-Oberflächen. Dort bekommt man Echtzeitanforderungen höchstens innerhalb von Gerätetreibern während diese „die Kontrolle” über das System haben.
Baltes
User
Beiträge: 4
Registriert: Sonntag 28. Dezember 2014, 17:29

Hallo.
@ Sirius3
Ich kann es ja mal bisschen beschreiben.
Externe Hardwar liefert Messdaten. Diese werden über Python abgefragt und in eine Liste zwischen gespeichert und dann in eine Datei geschrieben. Dieses Zwischenspeichern ist die Schleife die ich gepostet habe. Es sollen in der Zeit X Sekunden 500 Messwerte ermittelt werden. Deswegen das Sleep(), dass ich das Variabel anpassen kann.
Bedeutet jetzt als Beispiel, bei 20 Sekunden Aufnahme entstehen 500 Messwerte (auf meinem Laptop wo es mit sleep() ohne Probleme funktioniert).

Wenn ich jetzt sleep() weglasse weil es lackt, dann könnte ich einfach alle Messwerte Aufzeichnen und im nachhinein auf 500 Messwerte reduzieren. Entweder durch Mittelwert oder durch jeden xten Wert oder sonst wie.... Bedeutet aber bei mir, da mein externes Gerät eine ordenliche Leistung hat, es entstehen bei 20 Sekunden ca. 4 Millionen Messwerte. Das meine ich mit explodierenden Datenmengen.

@ Alle
Was ich aber immernoch nicht verstehen oder nachvollziehen kann, warum funktioniert mein Script bzw. Programm bei meinem Laptop Sony Vaio, mit Windows Vista ohne Probleme, ich kann Zeiten "Stoppen" von einzelnen Millisekunden und andere Rechner schaffen es einfach nicht.
Habe ich vielleicht irgendwas anderes nicht bedacht?

Liebe Grüße
BlackJack

@Baltes: Ein Mehrprozessbetriebssystem hat halt nicht nur einen Prozess am laufen und muss die Prozessorzeiten irgendwie auf die Prozesse aufteilen. Und auch auf Gerätetreiber. Und spätestens die können, weil sie teilweise wirklich Echtzeitanforderungen haben, andere Prozesse nahezu beliebig aufhalten, weil das Betriebssystem denen nicht mitten in einer zeitkritischen Operationen den Prozessor wegnehmen wird. Wie genau so etwas wie `sleep.time()` ist, hängt von ganz vielen Faktoren ab. Die Hardware, also nicht nur der Prozessor, sondern auch was da sonst noch so verbaut ist, die Treiber für die diverse Hardware, das Betriebssystem und dessen (Vor)Einstellungen wie es mit Hardware umgeht, wie viele Prozesse laufen und was die so tun, also welche Hardware + Treiber die beschäftigen, …

Normalerweise würde ich da ja irgendwo Untersützung von der Hardware oder einem Gerätetreiber erwarten um vernünftig Samplen zu können, als sowohl zum Steuern der Samplerate als auch zum minimieren von Jitter.
Baltes
User
Beiträge: 4
Registriert: Sonntag 28. Dezember 2014, 17:29

Hi,
danke für die Antwort.
Ja dann wird es wohl auf die Hardware hinauslaufen.
Dann werde ich den Code von der Hardware nochmal bisschen ändern.
Werde dort schonmal die Samplerate minimieren, dass ich mit dem PC nicht mehr soviel Arbeit habe.

LG
Antworten