【问题标题】:In multithreading in python, how to yield for result and return thread value?在python的多线程中,如何产生结果并返回线程值?
【发布时间】:2021-01-22 22:40:48
【问题描述】:

运行此代码,我得到以下日志,而不是 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>
...

是的:

[&lt;Future at 0x7f82c8ebf390 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb636f10 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0af090 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0af190 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0af350 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0ae350 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0ae290 state=running&gt;, &lt;Future at 0x7f82cb0aea10 state=finished raised NameError&gt;, &lt;Future at 0x7f82cb0ae950 state=running&gt;,...]

【问题讨论】:

    标签: python multithreading threadpool yield threadpoolexecutor


    【解决方案1】:

    两种简单的方法是: 1- 让您的 f() 将结果存储在类或类实例变量中; 2- 使用 concurrent.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())
    

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多