簡體   English   中英

從另一個線程在主線程中調用函數?

[英]Call function in main thread from another thread?

我有3個線程。 每個線程都存儲一個val 每個線程都從websocket接收消息。 在每個線程中調用on_message() ,會更新val ,我想在主線程中調用一個函數on_message()和所有3個線程的val

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

我當前的解決方案是

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

問題是該代碼使用100%CPU,即使沒有更新val也重復計算sum 但我不想使用sleep()因為任何線程中的val一旦更新,我都需要盡快計算總和。 我已經讀過有關使用隊列的信息,但是我不想使用Queue因為我不需要全部都執行它們,而只需要執行它們即可。 那么,在線程1、2或3中調用on_message()時,是否有一種在主線程中調用函數的方法?

Queue實際上是解決此問題的合適方法。 您已將每個更新的值添加到隊列中,並且主線程將每次都等待添加一個項目。 您可以將其格式化為某種“事件流”,以便知道其來源。 隊列中的每個值可能類似於:

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

我假設在每個線程中都有某種Produce 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)

希望這能給您一些想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM