2016-07-29 5 views
0

Plattform: Python 2.6 auf CentOS 6Wie beschleunige ich das Warteaufwachen von notify_all?

Ich habe 2 Threads mit dem gleichen Objekt. Thread 1 füttert die Objektdaten und wenn die korrekten Daten gefunden werden, wird ein threading.Condition.notify_all().

Thread 2 ruft über das Objekt threading.Condition.wait() mit der gleichen Bedingungsvariablen auf.

Ich ergreife datetime.datetime.now() vor dem notify_all() Anruf, und nach dem wait() Anruf. Der Zeitunterschied zwischen den beiden variiert zwischen 9 und 45 ms. Das ist eine Ewigkeit!

Was ich versucht habe: Ich habe os.nice() genannt die Priorität der Thread1 zu verringern, in der Hoffnung, dass es einen unmittelbaren Zusammenhang Schalter zwingen würde, [Ich nenne os.nice() innerhalb des Thread 1 threading.Thread() Ziel]. Keine Liebe. Auch keine Liebe durch Hinzufügen einer time.sleep(0.001) nach dem Anruf zu notify_all().

Ich sollte auch beachten, das ist eine Multi-Prozess-Anwendung, diese 2 Threads sind in einem von etwa 5 Prozessen. Ich laufe auf einem Xeon mit 8 hyper-Threaded Kernen und 32 GB RAM. Die Prozessor-Pipe sollte also phänomenal sein.

Vorschläge? Fragen, die ich stellen muss, dass ich mich vielleicht noch nicht gefragt habe? Ich erwarte eine Zeit für den Kontextwechsel, aber 45 ms scheint absolut lächerlich. Es ist wirklich eine Ewigkeit.

BEARBEITEN: der Code, der die Bedingungsvariable verwendet.

def ProcessEvent(self, event): 
    with self.__conditionVar: 
     if self.__testEvent(event): 
      self.__notifyTime = datetime.now() 
      self.__conditionVar.notify_all() 

def WaitForEvent(self, timeout_sec): 
    with self.__conditionVar: 
     if not self.__alreadyFound(): 
      self.__conditionVar.wait(timeout_sec) 
      delta = datetime.now() - self.__notifyTime 
      print "Wake-up time =", delta 
+0

Es ist nicht Kontextumschaltzeit. Es ist Zeit, dass der erste Thread mit dem Objekt endet. Der Hauptpunkt der Sperre besteht darin, zu verhindern, dass zwei Threads gleichzeitig auf den Thread zugreifen. Sie müssen sich abwechseln. –

Antwort

0

die Spur beschleunigen von notify_all auf, die Sperre für weniger Zeit nach wait Renditen halten. Es ist die Sperre, die verhindert, dass der andere Thread Fortschritte macht.

Wenn dies die Lösung Ihres Problems nicht offensichtlich macht, gibt es eine sehr gute Chance, dass Sie Bedingungen missbrauchen. Wenn ja, erläutern Sie, warum Sie Bedingungen verwenden.

+0

Ich habe den Code aus den 2 Funktionsaufrufen hinzugefügt. Sobald ich 'notify_all()' Ich lasse das Schloss los. – PfunnyGuy

+0

@PfunnyGuy Du hast mich falsch verstanden. Ich sagte, "halte das Schloss für weniger Zeit * nach Warten zurück *". –

+0

Ich werde wieder über CV's gelesen haben. Ich dachte, dass die Sperre zurückgegeben wird, sobald die 'wait()' zurückgegeben wird, weil sie den 'with'-Block beendet hat. Das wird meine Nummer 1 nach einer Nacht schlafen. – PfunnyGuy

Verwandte Themen