私は3つのスレッドを持っています。各スレッドはを格納しval
ます。そして、各スレッドはWebSocketからメッセージを受信します。ときは、on_message()
各スレッドで呼び出され、val
更新され、私は合計する私のメインスレッドで関数を呼び出すしたいされval
、すべての3つのスレッドの秒。
thread1.start()
thread2.start()
thread3.start()
私の現在の解決策は
while True:
sum = thread1.val + thread2.val + thread3.val
問題は、このコードが100%CPUを使用していsum
て、val
更新されていなくても繰り返し計算していることです。ただし、スレッドが更新さsleep()
れるとすぐにval
合計を計算する必要があるため、使用したくありません。キューの使用について読んだことがありますがQueue
、すべてを実行する必要はなく、最新のものだけを実行する必要があるため、使用したくありません。ではon_message()
、スレッド1、2、または3で呼び出されたときに、メインスレッドで関数を呼び出す方法はありますか?
これをQueue
行うには、実際にはAが適切な方法です。更新された各値がキューに追加され、メインスレッドは毎回アイテムが追加されるのを待ちます。ある種の「イベントストリーム」としてフォーマットして、どこから来たのかを知ることができます。キュー内の各値は次のようになります。
{
"source": "THREAD_A",
"value": 42
}
各スレッドには、ある種のproduce()
機能があると思います。次のようになります。
def produce(event_queue):
while True:
value = do_something()
event_queue.put({"source": ME, "value": value})
そして、メインスレッドで:
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()
関数により、メインスレッドは次のイベントが発生するまで待機し、その後続行してその値を処理します。そのため、新しいメッセージが到着するたびに1回だけ再計算されます。
あなたのon_message()
比喩を維持するために、あなたはあなたがlast_event
呼び出す値として考えることができますon_message()
、そしてそれの直後に起こるすべてはそのメソッドの内部として考えられます。つまり、必要に応じて、独自のメソッドとして記述できます。
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)
これがあなたに少しのアイデアを与えることを願っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加