首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中获取线程的返回值?

如何在python中获取线程的返回值?
EN

Stack Overflow用户
提问于 2011-08-01 11:20:30
回答 20查看 490.1K关注 0票数 483

函数foo下面返回一个字符串'foo'..。如何获取该值'foo'线程的目标返回的是什么?

代码语言:javascript
运行
复制
from threading import Thread

def foo(bar):
    print('hello {}'.format(bar))
    return 'foo'

thread = Thread(target=foo, args=('world!',))
thread.start()
return_value = thread.join()

上面所示的“一种显而易见的方法”不起作用:thread.join()返回None..。

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2019-11-13 11:18:27

在Python 3.2+中,stdlibconcurrent.futures模块提供了更高级别的API,以threading,包括将返回值或异常从工作线程传递回主线程:

代码语言:javascript
运行
复制
import concurrent.futures

def foo(bar):
    print('hello {}'.format(bar))
    return 'foo'

with concurrent.futures.ThreadPoolExecutor() as executor:
    future = executor.submit(foo, 'world!')
    return_value = future.result()
    print(return_value)
票数 191
EN

Stack Overflow用户

发布于 2011-08-01 11:34:36

我见过的一种方法是将一个可变对象与索引或其他标识符一起传递给线程的构造函数。然后,线程可以将其结果存储在该对象的专用槽中。例如:

代码语言:javascript
运行
复制
def foo(bar, result, index):
    print 'hello {0}'.format(bar)
    result[index] = "foo"

from threading import Thread

threads = [None] * 10
results = [None] * 10

for i in range(len(threads)):
    threads[i] = Thread(target=foo, args=('world!', results, i))
    threads[i].start()

# do some other stuff

for i in range(len(threads)):
    threads[i].join()

print " ".join(results)  # what sound does a metasyntactic locomotive make?

如果你真的想join()若要返回被调用函数的返回值,可以使用Thread如下所示的子类:

代码语言:javascript
运行
复制
from threading import Thread

def foo(bar):
    print 'hello {0}'.format(bar)
    return "foo"

class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs={}, Verbose=None):
        Thread.__init__(self, group, target, name, args, kwargs, Verbose)
        self._return = None
    def run(self):
        if self._Thread__target is not None:
            self._return = self._Thread__target(*self._Thread__args,
                                                **self._Thread__kwargs)
    def join(self):
        Thread.join(self)
        return self._return

twrv = ThreadWithReturnValue(target=foo, args=('world!',))

twrv.start()
print twrv.join()   # prints foo

由于一些名称混乱,它会变得有点混乱,并且它会访问特定于以下内容的“私有”数据结构Thread实现...但它是有效的。

对于python3

代码语言:javascript
运行
复制
class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs={}, Verbose=None):
        Thread.__init__(self, group, target, name, args, kwargs)
        self._return = None
    def run(self):
        print(type(self._target))
        if self._target is not None:
            self._return = self._target(*self._args,
                                                **self._kwargs)
    def join(self, *args):
        Thread.join(self, *args)
        return self._return
票数 340
EN

Stack Overflow用户

发布于 2013-01-13 07:22:01

FWIW,multiprocessing模块为此提供了一个很好的接口,该接口使用Pool类。如果您想继续使用线程而不是进程,可以只使用multiprocessing.pool.ThreadPool类作为临时替换类。

代码语言:javascript
运行
复制
def foo(bar, baz):
  print 'hello {0}'.format(bar)
  return 'foo' + baz

from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=1)

async_result = pool.apply_async(foo, ('world', 'foo')) # tuple of args for foo

# do some other stuff in the main process

return_val = async_result.get()  # get the return value from your function.
票数 310
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6893968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档