[英]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.