【问题标题】:How to run two parallel requests and join result in Python如何在 Python 中运行两个并行请求并加入结果
【发布时间】:2018-01-19 20:31:40
【问题描述】:

我有以下代码:

def do_smth(query):
    result_1 = api_request_1(query) # ['1', '2', '3']
    result_2 = api_request_2(query) # ['a', 'b', 'c']
    return result_1 + result_2      # ['1', '2', '3', 'a', 'b', 'c']

现在我想并行运行这些请求并合并结果。所以我这样做:

def do_smth_parallel(query):
    pool = Pool(processes=2)

    result = []
    arg = [ query ]
    result.extend(pool.map(api_request_1, arg)[0])
    result.extend(pool.map(api_request_2, arg)[0])

    pool.close()
    pool.join()

    return result

到目前为止一切顺利,但map 是一个阻塞功能。所以... do_smth_parallel 并不多 parallel :) 我该怎么做?

附:在 Java 中,我会使用 ExecutorService 和几个 Futures 来实现这一目标

【问题讨论】:

    标签: python multithreading python-2.7 parallel-processing


    【解决方案1】:

    另一种方法是使用concurrent.futures 包:

    from concurrent.futures import Executor
    
    def do_smth_parallel(query):
        exc = Executor()
    
        req1 = exc.submit(api_request_1, query)
        req2 = exc.submit(api_request_2, query)
    
        return req1.result() + req2.result()
    

    【讨论】:

      【解决方案2】:

      您正在寻找map_async https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.AsyncResult 而不是map。这是您改编的示例。这可以应用于任意数量的函数调用。全部异步执行。

      def do_smth_parallel(query):
          pool = Pool(processes=2)
      
          result = []
          arg = [ query ]
          future_1 = pool.async_map(api_request_1, arg)
          future_2 = pool.async_map(api_request_2, arg)
      
          result_1 = future_1.get()
          results_2 = future_2.get()
      
          pool.close()
          pool.join()
      
          return result_1 + result_2
      

      【讨论】:

      • 谢谢。这解决了问题,但@Turn 的方式更高级别恕我直言
      猜你喜欢
      • 2020-03-14
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2020-08-01
      相关资源
      最近更新 更多