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



>我目前有这个函数,它执行一个 api 调用,每个 api 调用都在请求不同的数据。 我一次最多可以执行 300 个并发 api 调用。

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

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

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

您需要:

  1. 修复了在主线程中意外调用requests.get(...)的问题。
  2. 要么使用pool.map将工作列表并
  3. 发农场化到工作线程,要么继续使用pool.apply_async,但不是立即调用async_result.get(),而是将所有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,它将是:

results = pool.map(requests.get, [build_url(item) for item in variables])

相关内容

  • 没有找到相关文章

最新更新