如何使我的ThreadPool更好地处理请求

时间:2019-05-29 18:53:24

标签: python python-requests multiprocessing

我目前拥有此功能,该功能会进行api调用,每个api调用都请求不同的数据。我一次最多可以进行300个并发api调用。

这样做似乎并不快,因为这只是在等待repl,我想知道如何使此功能更快?

from multiprocessing.pool import ThreadPool
import requests

pool = ThreadPool(processes=500)
variables = VariableBaseDict
for item in variables:
    async_result = pool.apply_async(requests.get(url.json()))
    result = async_result.get()
    #do stuff with result

1 个答案:

答案 0 :(得分:2)

您当前的代码实际上并没有将任何实际工作分配给工作线程。您正在主线程中直接调用requests.get(url.json()),然后传递返回到pool.apply_async的对象。您应该改为使用pool.apply_async(requests.get, (url.json(),))。也就是说,即使您纠正了此问题,您也将立即等待对该呼叫的答复,这意味着您实际上从未同时运行任何呼叫。您将一个项目放到线程中,等待它完成,然后等待下一个项目。

您需要:

  1. 解决了您在主线程中意外调用requests.get(...)的问题。
  2. 使用pool.map将工作列表同时并发到工作线程中,或者继续使用pool.apply_async,但不要立即调用async_result.get(),而是存储所有{{1} }对象,然后遍历async_result,遍历variables列表并在每个项目上调用async_result。这样,您实际上最终会同时运行所有调用。

因此,如果您使用.get(),则会执行以下操作:

apply_async

使用async_results = [pool.apply_async(requests.get, (build_url(item),)) for item in variables] for ar in async_results: result = ar.get() # do stuff with result 将会是:

pool.map