2017-12-15 7 views
0

私は3つのスレッドを持っています。各スレッドにはvalが格納されます。各スレッドはwebsocketからメッセージを受信します。各スレッドでon_message()が呼び出されると、valが更新され、メインスレッドの関数を呼び出して、合計3スレッドのvalを合計します。他のスレッドのメインスレッドの関数呼び出し?

thread1.start() 
thread2.start() 
thread3.start() 

私の現在のソリューションは、問題は、このコードは、100%のCPUを使用して繰り返し何valが更新されていない場合でも、sumを計算していることである

while True: 
    sum = thread1.val + thread2.val + thread3.val 

です。しかし、sleep()を使用したくないのは、どんなスレッドでもvalが更新されると、できるだけ早く計算する必要があるからです。私はキューを使うことについて読んだことがありますが、Queueを使用したくないのは、それらがすべて実行される必要がないからです。 on_message()がスレッド1,2、または3で呼び出されたときに、メインスレッドで関数を呼び出す方法はありますか?

+0

各スレッドで 'on_message()'が呼び出されたとき、他の2つの 'vals'が合計できることをどのように確認できますか?スレッドは「どこでも」関数を呼び出すことができます。関数は単なるコードであり、任意のスレッドがいつでも実行できます。必要な値がまだ利用できない場合、処理を完了できないことがあります。 – martineau

+0

私は実際にはブロックを除いて試しにそれを持っています – LooksMoneyStatus

+0

残念ながら、それは私が意味するものではありません - それはすべてが生産されるまで値を合計することはできませんでした。あなたが受け入れた答えは、 "最後の出来事"があるという意味でそれに対処するのに役立ちます(しかしそれは私には完全にはっきりしません)。 – martineau

答えて

2

Queueは、これについて実際に適切な方法です。各更新された値にキューが追加され、メインスレッドはアイテムが毎回追加されるのを待ちます。あなたはそれがどこから来たのかを知るために何らかの "イベントストリーム"としてフォーマットすることができます。私はあなたが持っているそれぞれのスレッドでproduce()機能のいくつかの種類を想定してい

{ 
    "source": "THREAD_A", 
    "value": 42 
} 

:キュー内の各値は、次のようになります。それを

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0} 
while True: 
    s = sum(values.values()) 
    # ... 
    last_event = event_queue.get() 
    values[last_event["source"]] = last_event["value"] 

get()機能は、次のイベントが入ってくるまで待つメインスレッドを引き起こし、それは継続し、プロセスを:それはこのようなものになります。

def produce(event_queue): 
    while True: 
     value = do_something() 
     event_queue.put({"source": ME, "value": value}) 

をしてからメインスレッドに値。そのため、到着する新しいメッセージごとに正確に1回再計算されます。

on_message()のメタファーを保持するには、on_message()という値と、そのメソッドの内部として直後に発生するすべての値をlast_eventと考えることができます。あなたが望むなら、あなたはそれを独自の方法として書くことができます。

values = {"THREAD_A": 0, "THREAD_B": 0, "THREAD_C": 0} 
def on_message(v, message): 
    v[last_event["source"]] = last_event["value"] 
    s = sum(v.values()) 
    # ... 

while True: 
    last_message = event_queue.get() 
    on_message(values, last_message) 

これはあなたにちょっとしたアイデアを提供します。

関連する問題