[英]python threading - multiple parameter and return
我在 Python 中有這樣的方法:
def test(a,b):
return a+b, a-b
如何在后台線程中運行它並等待 function 返回。
問題是方法很大,項目涉及GUI,所以我不能等到它返回。
在我看來,除了這個線程之外,你應該運行另一個線程來檢查是否有結果。 或者實現在線程結束時調用的回調。 但是,由於您有 gui,據我所知,它只是一個 class -> 您可以將結果存儲到 obj/class 變量中並檢查結果是否出現。
我會使用有時使用的可變變量。 讓我們創建特殊的 class 用於存儲線程函數的結果。
import threading
import time
class ResultContainer:
results = [] # Mutable - anything inside this list will be accesable anywher in your program
# Lets use decorator with argument
# This way it wont break your function
def save_result(cls):
def decorator(func):
def wrapper(*args,**kwargs):
# get result from the function
func_result = func(*args,**kwargs)
# Pass the result into mutable list in our ResultContainer class
cls.results.append(func_result)
# Return result from the function
return func_result
return wrapper
return decorator
# as argument to decorator, add the class with mutable list
@save_result(ResultContainer)
def func(a,b):
time.sleep(3)
return a,b
th = threading.Thread(target=func,args=(1,2))
th.daemon = True
th.start()
while not ResultContainer.results:
time.sleep(1)
print(ResultContainer.results)
所以,在這段代碼中,我們有 class ResultContainer和list 。 無論您放入什么,您都可以從代碼中的任何位置輕松訪問它(線程之間等......由於 GIL,進程之間出現異常)。 我制作了裝飾器,因此您可以存儲任何 function 的結果,而不會違反 function。 這只是一個示例,您可以如何運行線程並讓它自己存儲結果而無需您處理它。 您所要做的就是檢查結果是否到達。
您可以使用全局變量來做同樣的事情。 但我不建議你使用它們。 它們很丑陋,使用它們時必須非常小心。
為了更簡單,如果您不介意違反 function,您可以在不使用裝飾器的情況下將結果推送到 class,並直接在 ZC1C425268E68385D1AB5074C17A94F1 中列出列表,如下所示:
def func(a,b):
time.sleep(3)
ResultContainer.results.append(tuple(a,b))
return a,b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.