如何在Python中运行两个并行请求并连接结果

2024-03-29 14:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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和几个Future来实现这一点


Tags: 代码apimapreturnparallelrequestdefarg
2条回答

您正在寻找map_asynchttps://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

另一种方法是使用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()

相关问题 更多 >