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