请求/异步:使用Python请求会话使pool_maxsize = 1000有缺陷吗?

时间:2019-05-20 21:11:22

标签: 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个会话,其中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

1 个答案:

答案 0 :(得分:1)

在HTTP 1.1中,客户端可以通过设置Keep-Alive标头通过同一连接发送多个请求。否则,您将不得不为每个单个请求打开一个新的连接。设置“保持活动”后,可以通过同一连接发送多个请求。

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

连接池的作用是,在您发出请求后,该连接将保留在池中,以供您可能随后发出的请求打开。请求设置了“保持活动”标头并在后台管理池,因此您通常不必担心。

如果使用多线程,则池将同步对连接的访问​​,以便每个连接一次只能由一个线程使用。具有多个线程同时发出请求需要池中有多个连接。

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

添加这样的连接虽然仅在您不受网络速度瓶颈的情况下有用,打开更多的连接并不能使Internet更快。因此,只需添加更多线程和连接,直到性能不再提高。

我不确定您动态调整尺寸的含义。池在需要时打开新连接,并在可能时重用旧连接。一旦达到最大值,它将停止打开连接。从某种意义上说,池大小是动态的,只要它小于最大大小即可。