簡體   English   中英

python 線程 - 多參數和返回

[英]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 ResultContainerlist 無論您放入什么,您都可以從代碼中的任何位置輕松訪問它(線程之間等......由於 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.

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