从另一个线程调用主线程中的函数?

时间:2017-12-15 01:23:20

标签: python multithreading

我有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()时有没有办法在主线程中调用函数?

1 个答案:

答案 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)

希望这会给你一些想法。