【问题标题】:How do I access the return values of ThreadPoolExecutor?如何访问 ThreadPoolExecutor 的返回值?
【发布时间】:2018-09-16 07:53:38
【问题描述】:

假设我有以下代码:

def func(a,b):
    return (func2(a),func3(3))

def paralel_func(alist,blist)
    with ThreadPoolExecutor(max_workers=None) as executor:
        executor.map(func,alist,blist)

如何访问从 func 返回的返回值?我试图通过认为executor.map 是一个包含值但对我不起作用的列表来弄清楚自己。

【问题讨论】:

  • func2在哪里?不清楚你真正想要什么。
  • func2 和 func3 是任意的非并行函数,它们返回一个我想在我完成计算后访问的值
  • 不管怎样,如果您的操作受 CPU 限制,那么您可能不想使用线程池,因为 Python 的全局解释器锁 (GIL)

标签: python threadpool future


【解决方案1】:

我在让其他选项按照我喜欢的方式工作时遇到了一些麻烦,我偶然发现了这个,这对我来说效果很好。 https://www.codegrepper.com/code-examples/whatever/generator+executor.map+python

它的核心

def main():
with concurrent.futures.ProcessPoolExecutor() as executor:
    for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
        print('%d is prime: %s' % (number, prime))

【讨论】:

  • 未显示完整范围的不完整答案是不够的。数、素数和素数在哪里定义?
【解决方案2】:

map 方法返回一个迭代器,该迭代器产生对func 的调用的结果。

【讨论】:

    【解决方案3】:

    我不知道你的 alist 和 blist 变量来自哪里,但你可以这样做。

    def func(a,b):
        return (func2(a),func3(3))
    
    def paralel_func(alist, blist):
        processes = []
        with ThreadPoolExecutor(max_workers=None) as executor:
            processes.append(executor.map(func, alist, blist))
    
            for _ in concurrent.futures.as_completed(processes):
                print('Result: ', _.result())
    

    【讨论】:

      【解决方案4】:

      也许你应该试试这个

      ablists = [alist, blist]
      
      with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
          future_list= {executor.submit(func, a, b): i for i in ablists}
      

      您可以在这里阅读更多关于 futures 和执行者的信息

      【讨论】:

      • 我是否必须遍历 alistblist 才能提交期货?
      猜你喜欢
      • 2020-05-26
      • 2017-10-25
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多