拥有此代码
import threading
def Thread(f):
def decorator(*args,**kargs):
print(args)
thread = threading.Thread(target=f, args=args)
thread.start()
thread.join()
decorator.__name__ = f.__name__
return decorator
@Thread
def add_item(a, b):
return a+b
print(add_item(2,2))
但函数永远不会返回值,退出获得返回的方式?
答案 0 :(得分:4)
返回None
的原因是因为没有任何东西可以返回(除了decorator
没有返回语句这一事实)。根据{{3}},join()
始终返回None
。
有关如何与线程通信的示例,请参阅documentation。
如果我可能会问:既然join()
阻止了调用线程,那么有什么可以获得?
编辑:我玩了一下,以下是一个不需要队列的解决方案(不是说这是一个更好的解决方案。只是不同):
import threading
# Callable that stores the result of calling the given callable f.
class ResultCatcher:
def __init__(self, f):
self.f = f
self.val = None
def __call__(self, *args, **kwargs):
self.val = self.f(*args, **kwargs)
def threaded(f):
def decorator(*args,**kargs):
# Encapsulate f so that the return value can be extracted.
retVal = ResultCatcher(f)
th = threading.Thread(target=retVal, args=args)
th.start()
th.join()
# Extract and return the result of executing f.
return retVal.val
decorator.__name__ = f.__name__
return decorator
@threaded
def add_item(a, b):
return a + b
print(add_item(2, 2))
答案 1 :(得分:2)
那是因为你永远不会在“装饰器”功能中返回一个值。
您必须在线程中包含一个共享变量,并将线程函数的返回值移回“decorator”函数。