Andere Lösung für einen Sleep oder Timer??

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
ScooB
User
Beiträge: 54
Registriert: Donnerstag 28. April 2011, 10:47

Hi, ich mal wieder :lol: ,

ich hab ne kleine frage und zwar hab ich mehrere Threads die in ne Datenbank schreiben in unterschiedlichen Intervallen
z.B.
Thread 1 schreibt alle 200ms
Thread 2 schreibt alle 500ms
Thread 3 schreibt alle 250ms
Thread 4 schreibt alle 1000ms

zur Zeit habe ich in meinen Schleifen nur nen Sleep mit den Intervallzeiten drin was allerdins blöd ist, da nur der Sleep z.B. die 200ms schläft und wenn eine druchlauf zum schreiben in die DB 30-50ms dauert dann verängert sich mein Intervall. Gibt es da eine bessere Methode oder muss ich wirklich die Zeit errechnen und dann abziehen?

Gruß ScooB
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was hast du denn vor, wenn der Zugriff auf die Datenbank in Thread 1 250ms benötigt?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

Irgendjemand wird das schreiben müssen und wahrscheinlich wirst du das sein. Ich sehe da nun aber wirklich nicht die Schwierigkeit, mit dem time-Modul ist das doch in maximal 3 Zeilen gelöst. Das wäre sicher schneller gewesen als deinen Beitrag zu schreiben ^^ Viel wichtiger ist eigentlich die Frage auf die jbs schon hingewiesen hat.

Sebastian
Das Leben ist wie ein Tennisball.
ScooB
User
Beiträge: 54
Registriert: Donnerstag 28. April 2011, 10:47

Könnte ja sein das es ne elegantere Lösung geben würde als

Code: Alles auswählen

while self.startstop:
                self.timediff = time.clock()
                wirteDB("blabla")
                self.timediff = (time.clock() - self.timediff)
                time.sleep(((self.interval/1000.0)-self.timediff))
habs jetzt halt so
deets

oh, das geht ganz bestimmt eleganter. Naemlich alleine schon dadurch, dass du auf die voellig sinnfreie Nutzung einer Instanzvariable (self.timediff) verzichtest, und das eine lokale Variable (nur timediff) machst.

Es sollten einen Zustandsschutzbeauftragten geben... "Es gilt das Gebot der Zustandssparsamkeit".

Und du musst testen, ob das resultierende Intervall unter Umstaenden kleiner 0 ist. time.sleep mit negativen Werten wird naemlich mit ner Exception abrauchen.

Und ansonsten vielleicht noch System-Timer, aber die sind letztlich auch nicht einfacher anzuwenden und sparen dir halt das bisschen rumgerechne.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du solltest die Zeit pro Schleifendurchlauf nur einmal messen, sonst handelst du dir Ungenauigkeiten ein. Momentan vernachlässigst du zum Beispiel das sleep bei der Gesamtzeit. Dabei ist nicht die Dauer des sleep-Aufrufs wichtig, bzw. der damit verbundene Overhead, sondern die Ungeanuigkeit von sleep. Dieses kehrt nicht exakt zum gewünschten Zeitpunkt zurück, sondern schwankt irgendwo im Millisekundenbereich.

Auch ist der Name timediff etwas ungünstig gewählt. Es handelt sich nicht um eine Differenz von Zeiten sondern um eine absolute Zeit.
Das Leben ist wie ein Tennisball.
ScooB
User
Beiträge: 54
Registriert: Donnerstag 28. April 2011, 10:47

@deets: Ja das mit der Inszantvariable mach ich noch hatte den Code vorher noch in nem anderen teil drin, und das mit dem kleiner 0 musst ich noch abfangen da hast Recht Danke

@EyDu: Die gewisse Ungenauigkeit ist noch vertretbar und der Name timediff ist nicht der entgültige Name ;) ich geb meine Variablen nach dem testen bessere Namen
Antworten