首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Requests / Asyncio:使用Python请求会话创建pool_maxsize=1000有什么缺点吗?

Requests / Asyncio:使用Python请求会话创建pool_maxsize=1000有什么缺点吗?
EN

Stack Overflow用户
提问于 2019-05-21 05:11:22
回答 1查看 439关注 0票数 1

我使用以下代码来增加具有请求的池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

  • Create 2个会话,一个使用pool_maxsize = 1,另一个使用
  1. pool_maxsize as。(如果可能)

速度是最重要的!

编辑:大部分时间我都在做正常的请求:

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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 06:44:47

在HTTP1.1中,通过设置Keep-Alive标头,客户端能够通过同一连接发送多个请求。否则,您将不得不为每个请求打开一个新连接。使用Keep-Alive set,可以通过同一连接发送多个请求。

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

连接池的作用是,在您发出请求后,该连接将保持打开状态,以供您可能发出的后续请求使用,并留在池中。Requests设置keep alive头部并在后台管理池,因此您通常不需要担心这一点。

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

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

虽然像这样添加连接只在你没有被网络速度瓶颈时才有帮助,但打开更多的连接并不能让互联网更快。因此,只需添加更多threads+connections,直到性能停止增长。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56228235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档