我使用以下代码来增加具有请求的池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个连接。
或者,有没有一种方法可以动态调整池大小?
哪种解决方案最好:
当我需要不同数量的连接时,alter
pool_maxsize = 1000
pool_maxsize = 1
,另一个使用速度是最重要的!
编辑:大部分时间我都在做正常的请求:
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
发布于 2019-05-23 06:44:47
在HTTP1.1中,通过设置Keep-Alive标头,客户端能够通过同一连接发送多个请求。否则,您将不得不为每个请求打开一个新连接。使用Keep-Alive set,可以通过同一连接发送多个请求。
打开连接非常耗时,因为它需要额外的TCP握手往返,然后才能发出下一个请求,因此重用现有连接会更快。
连接池的作用是,在您发出请求后,该连接将保持打开状态,以供您可能发出的后续请求使用,并留在池中。Requests设置keep alive头部并在后台管理池,因此您通常不需要担心这一点。
如果您正在使用多线程,则池将同步对连接的访问,以便每个连接一次仅由一个线程使用。让多个线程同时发出请求需要池中的多个连接。
拥有比线程更多的连接根本不会提高性能,因为请求包会在发出请求时阻塞线程,因此线程不可能同时使用多个连接。为了从额外的连接中获得更高的性能,需要增加线程的数量。
虽然像这样添加连接只在你没有被网络速度瓶颈时才有帮助,但打开更多的连接并不能让互联网更快。因此,只需添加更多threads+connections,直到性能停止增长。
我不确定你说的动态调整大小是什么意思。该池在需要时打开新连接,并在可能时重用旧连接。一旦达到最大值,它就会停止打开连接。在某种意义上,只要池大小低于最大值,池大小就是动态的。
https://stackoverflow.com/questions/56228235
复制相似问题