Hi, ich mal wieder ,
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
Andere Lösung für einen Sleep oder Timer??
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]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
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
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.
Könnte ja sein das es ne elegantere Lösung geben würde als
habs jetzt halt so
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))
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.
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.
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.
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.
@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
@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