Seite 1 von 1

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

Verfasst: Dienstag 19. Juni 2012, 09:40
von ScooB
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

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

Verfasst: Dienstag 19. Juni 2012, 09:42
von jbs
Was hast du denn vor, wenn der Zugriff auf die Datenbank in Thread 1 250ms benötigt?

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

Verfasst: Dienstag 19. Juni 2012, 09:53
von EyDu
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

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

Verfasst: Dienstag 19. Juni 2012, 10:08
von ScooB
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

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

Verfasst: Dienstag 19. Juni 2012, 10:18
von 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.

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

Verfasst: Dienstag 19. Juni 2012, 10:32
von EyDu
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.

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

Verfasst: Mittwoch 20. Juni 2012, 08:12
von ScooB
@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