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
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. –