在python中的多线程中,如何产生结果并返回线程值?

问题描述

运行此代码,我得到以下日志,而不是future值,而是线程对象。产生f结果并最终返回值的Y的正确方法是什么?

Y = []
process_pool = ThreadPoolExecutor(4)
f = partial(some_func,*args)
for i in range(1000):
    future = process_pool.submit( f,i)
    print(future)
    Y.append(future)
return Y 

日志:

<Future at 0x7f82c8ebf390 state=running>
<Future at 0x7f82cb636f10 state=running>
<Future at 0x7f82cb0af090 state=running>
<Future at 0x7f82cb0af190 state=running>
<Future at 0x7f82cb0af350 state=pending>
<Future at 0x7f82cb0ae350 state=pending>
...

Y:

[<Future at 0x7f82c8ebf390 state=finished raised NameError>,<Future at 0x7f82cb636f10 state=finished raised NameError>,<Future at 0x7f82cb0af090 state=finished raised NameError>,<Future at 0x7f82cb0af190 state=finished raised NameError>,<Future at 0x7f82cb0af350 state=finished raised NameError>,<Future at 0x7f82cb0ae350 state=finished raised NameError>,<Future at 0x7f82cb0ae290 state=running>,<Future at 0x7f82cb0aea10 state=finished raised NameError>,<Future at 0x7f82cb0ae950 state=running>,...]

解决方法

两种简单的方法是:1-使您的f()将结果存储在类或类实例变量中; 2-使用current.futures.as_completed()

import concurrent.futures

Y = []
l_tasks = [] 
with concurrent.futures.ThreadPoolExecutor() as executor:
    for i in range(1000):
        l_tasks.append(executor.submit(f,i))
    for task in concurrent.futures.as_completed(l_tasks):
        Y.append(task.result())