如何使用装饰器和线程返回函数值

时间:2009-05-19 18:46:55

标签: python multithreading decorator

拥有此代码

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))

但函数永远不会返回值,退出获得返回的方式?

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”函数。