python - 请求/异步: Is there a drawback for making pool_maxsize=1000 with a Python requests session?

标签 python asynchronous parallel-processing python-requests python-asyncio

我使用以下代码来增加请求的池最大大小:

import requests
session = requests.Session()
session.mount("https://", requests.adapters.HTTPAdapter(pool_maxsize=50))
session.mount("http://", requests.adapters.HTTPAdapter(pool_maxsize=50))

设置pool_maxsize=1000有缺点吗?

我有时需要 50 - 1000 个连接,但大多数时候我只需要 1 个连接。

或者,有没有办法允许动态调整池大小?

哪种解决方案最好:

  1. 设置pool_maxsize = 1000
  2. 创建 2 个 session ,其中 1 个使用 pool_maxsize = 1,另一个使用 pool_maxsize=1000
  3. 当我需要不同数量的连接时,动态更改 pool_maxsize。 (如果可能的话)

速度至关重要!

编辑: 大多数时候我都在做正常的请求:

session.get(....)

但有时我使用 asyncio 时会有大量请求需要执行:

import asyncio
async def perform_async_calls(self, session, urls):
    loop = asyncio.get_event_loop()
    futures = []
    for url in urls:
        futures.append(loop.run_in_executor(None, session.get, url)

    results = []
    for future in futures:
        result = await future
        results.append(result.json())

    return results

最佳答案

在 HTTP 1.1 中,客户端可以通过设置 Keep-Alive header 通过同一连接发送多个请求。否则,您将必须为每个请求打开一个新连接。设置 Keep-Alive 后,可以通过同一连接发送多个请求。

打开连接非常耗时,因为在发出下一个请求之前需要进行额外的 TCP 握手往返,因此重用现有连接会更快。

连接池的作用是,在您发出请求后,该连接将在池中保留,以供您可能发出的后续请求保持打开状态。请求设置保持事件 header 并在幕后管理池,因此您通常不需要担心它。

如果您使用多线程,池会同步对连接的访问​​,以便每个连接一次仅由一个线程使用。让多个线程同时发出请求需要池中有多个连接。

拥有比线程更多的连接根本不会提高性能太多,因为请求包在发出请求时会阻塞线程,因此一个线程不可能一次使用多个连接。要从额外连接中获得更多性能,需要增加线程数量。

像这样添加连接仅在您不受网络速度瓶颈时才有帮助,打开更多连接并不会使互联网更快。因此,只需添加更多线程+连接,直到性能停止增加。

我不确定你所说的动态调整大小是什么意思。池在需要时打开新连接,并在可能时重用旧连接。一旦达到最大值,它就会停止打开连接。从某种意义上说,只要池大小低于最大大小,池大小就是动态的。

关于python - 请求/异步: Is there a drawback for making pool_maxsize=1000 with a Python requests session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228235/

相关文章:

python - 在 while 循环之外访问变量,Python

javascript - 在事件循环为空或超时后退出 Node.js 进程

javascript - 异步迭代时的node.js数据一致性

asynchronous - 在 Protractor 中获取请求异步调用

windows - 如何改变 explorer.exe 和 service.exe 的启动方式来编辑进程关联?

c# - 从 SQL Server 并行读取

python - 属性错误 : 'module' object has no attribute 'SystemSettings_GetFont'

python - 忽略 python 文件的其余部分

python - 当参数包含队列时,如何将特定于工作程序的初始化参数传递给工作程序池?

jquery - 如何使所有 AJAX 调用按顺序进行?