我正在使用以下代码通过请求增加池的最大大小:
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个连接。
或者,有没有办法允许动态调整池大小?
哪种解决方案是最好的:
pool_maxsize = 1000
pool_maxsize = 1
,另一个与pool_maxsize=1000
。速度至关重要!
编辑: 大多数情况下,我在执行正常的请求:
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
答案 0 :(得分:1)
在HTTP 1.1中,客户端可以通过设置Keep-Alive标头通过同一连接发送多个请求。否则,您将不得不为每个单个请求打开一个新的连接。设置“保持活动”后,可以通过同一连接发送多个请求。
打开连接非常耗时,因为在发出下一个请求之前,TCP握手需要额外的往返行程,因此重新使用已存在的连接会更快。
连接池的作用是,在您发出请求后,该连接将保留在池中,以供您可能随后发出的请求打开。请求设置了“保持活动”标头并在后台管理池,因此您通常不必担心。
如果使用多线程,则池将同步对连接的访问,以便每个连接一次只能由一个线程使用。具有多个线程同时发出请求需要池中有多个连接。
连接数多于线程数根本不会提高性能,因为请求包在发出请求时会阻塞线程,因此线程不可能一次使用多个连接。为了从其他连接中获得更多性能,需要增加线程数。
添加这样的连接虽然仅在您不受网络速度瓶颈的情况下有用,打开更多的连接并不能使Internet更快。因此,只需添加更多线程和连接,直到性能不再提高。
我不确定您动态调整尺寸的含义。池在需要时打开新连接,并在可能时重用旧连接。一旦达到最大值,它将停止打开连接。从某种意义上说,池大小是动态的,只要它小于最大大小即可。