python - 如何让我的线程池更好地处理请求

标签 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

最佳答案

您当前的代码实际上并未将任何实际工作转移给工作线程。您正在主线程中调用 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(),将所有 async_result 对象存储在列表中,迭代变量后,迭代 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])

关于python - 如何让我的线程池更好地处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56366864/

相关文章:

java - 如何从Spring Boot调用Python程序?

python - Pandas :如何在同一单元格上读取多行 csv?

python - 将curl 转换为Python requests.put

ssl - 是否可以识别 TLS 信息。在请求响应中?

python - 为什么在 `multiprocessing.Pool().apply_async()` 中使用了不止一名 worker ?

python - Python中的多处理内存错误

javascript - 如何将变量从 javascript 表单传递给 python(在同一台计算机上)?

Python:使用其他列将值分配给 Pandas 中的新列作为列表

php - API 请求在本地机器上工作,而不是在服务器上

python - 为什么使用多处理没有更快?我做错了吗?