我有3个帖子。每个线程都存储val
。每个线程都从websocket接收消息。在每个线程中调用on_message()
时,val
会更新,我想在主线程中调用一个函数来对所有3个线程中的val
求和。
thread1.start()
thread2.start()
thread3.start()
我目前的解决方案是
while True:
sum = thread1.val + thread2.val + thread3.val
问题是此代码使用100%CPU并重复计算sum
即使没有更新val
。但我不想使用sleep()
,因为只要更新任何线程中的val
,我就需要尽快计算总和。我已经阅读过有关使用队列的信息,但我不想使用Queue
,因为我不需要它们全部执行,只需要最新执行。
那么在线程1,2或3中调用on_message()
时有没有办法在主线程中调用函数?
答案 0 :(得分:2)
Queue
实际上是实现此目的的合适方法。您将每个更新的值添加到队列中,主线程将等待每次添加项目。您可以将其格式化为某种"事件流"所以你知道它来自哪里。队列中的每个值可能类似于:
{
"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()
函数导致主线程等到下一个事件进入,然后它继续并处理该值。因此,它会为每个到达的新消息重新计算一次。
要与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)
希望这会给你一些想法。