【问题标题】:Requests / Asyncio: Is there a drawback for making pool_maxsize=1000 with a Python requests session?Requests / Asyncio:使用 Python 请求会话使 pool_maxsize=1000 有缺点吗?
【发布时间】:2019-05-20 21:11:22
【问题描述】:

我正在使用以下代码通过请求来增加池 maxsize:

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 个会话,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

【问题讨论】:

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


    【解决方案1】:

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

    打开连接需要花费大量时间,因为它需要额外的 TCP 握手往返,然后才能发出下一个请求,因此重用现有连接会更快。

    连接池的作用是,在您发出请求后,该连接会为您可能发出的后续请求保持打开状态,并保留在池中。 Requests 设置 keep alive 标头并在后台管理池,因此您通常无需担心。

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

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

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

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

    【讨论】:

    • 感谢您的回答!请查看我的编辑,我想主要问题是我的阻塞、单个 requests.get 调用是否会因使用我用于异步调用的同一会话而减慢,且 pool_maxsize 为 1000。
    • @ZakStucke,如果您的连接数多于线程数,则不会。添加更多线程会增加运行程序的开销,但在此之前网络应该会成为瓶颈。您可以将自己的 ThreadPoolExecutor 传递给 run_in_executor 以控制它使用的线程数。默认情况下,它使用逻辑处理器的数量,因此将线程数量增加到超过该数量可以提高性能。您也可以使用相同的执行程序来处理其他请求,以便所有请求都使用相同的线程池。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2013-09-25
    相关资源
    最近更新 更多