2016-07-29 16 views
0

プラットフォーム: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 
+0

コンテキスト切り替え時間ではありません。最初のスレッドがオブジェクトで終了する時です。ロックのポイントは、2つのスレッドが同時にスレッドにアクセスするのを防ぐことです。彼らは交代しなければならない。 –

答えて

0

wait戻った後、短い時間のためにロックを保持し、notify_allからウェイクをスピードアップします。これは、他のスレッドが進行しないようにするロックです。

この方法で問題が解決されない場合は、条件が悪用される可能性が非常に高いです。その場合は、条件を使用する理由を説明してください。

+0

2つの関数呼び出しからコードを追加しました。すぐに私はnotify_all() '私はロックを離れる。 – PfunnyGuy

+0

@PfunnyGuyあなたは私を誤解しています。私は「待ってから戻ってくる時間が短く*ロックを保持する」と言った。 –

+0

私はCVについてもう一度読むつもりです。 'with'ブロックを終了したので、' wait() 'が返されるとすぐにロックが返されていると思いました。それは、夜の眠りの後で私の#1になるでしょう。 – PfunnyGuy

関連する問題