プラットフォーム:Python 2.6 on CentOS 6notify_allからウェイクアップをスピードアップする方法はありますか?
同じオブジェクトを使用する2つのスレッドがあります。スレッド1はオブジェクトデータをフィードし、正しいデータが見つかるとthreading.Condition.notify_all()
を返します。
スレッド2はオブジェクトを介して同じ条件変数にthreading.Condition.wait()
を呼び出します。
notify_all()
コールの前とwait()
コールの前に、私はdatetime.datetime.now()
をつかんでいます。両者の時間差は9〜45msです。それは永遠です!
私が試したこと:os.nice()
を呼び出して、即時のコンテキスト切り替えを強制することを望んで、スレッド1の優先度を下げました[スレッドthreading.Thread()
ターゲット内にos.nice()
を呼び出します]。愛はない。また、notify_all()
への呼び出しの後にtime.sleep(0.001)
を追加して愛がない。
これはマルチプロセスアプリケーションであることにも注意してください。これらの2つのスレッドは約5つのプロセスのうちの1つです。私は8つのハイパースレッドコアと32 GBのRAMを搭載したXeonで動いています。したがって、プロセッサパイプは驚異的でなければなりません。
提案?私がまだ自分自身に尋ねていないかもしれないと尋ねる必要がある質問?私はいくつかのコンテキスト切り替えの時間を期待していますが、45msは絶対に馬鹿げているようです。本当に永遠です。
EDIT:条件変数を使用するコード。
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
コンテキスト切り替え時間ではありません。最初のスレッドがオブジェクトで終了する時です。ロックのポイントは、2つのスレッドが同時にスレッドにアクセスするのを防ぐことです。彼らは交代しなければならない。 –