首页 > 编程问答 >aiohttp 存在超时问题,但请求没有超时问题

aiohttp 存在超时问题,但请求没有超时问题

时间:2024-08-04 15:41:56浏览次数:7  
标签:python python-3.x python-requests python-asyncio aiohttp

我正在尝试使用两种不同的方法在 Python 中获取网页: requests aiohttp requests 方法工作正常,但 aiohttp 方法会导致超时。代码如下:

import asyncio
import aiohttp
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
    "X-Requested-With": "XMLHttpRequest",
    "Cookie": ""
}

url = "an_url"

async def request_requests():
    print("Requesting...")
    try:
        response = requests.get(url, headers=headers, timeout=3)
        print(response.text)
    except requests.exceptions.ReadTimeout:
        print("Timeout REQUESTS")


async def request_aiohttp():
    print("Requesting...")
    try:
        async with aiohttp.ClientSession(headers=headers, timeout=aiohttp.ClientTimeout(total=3)) as session:
            async with session.get(url) as response:
                print(await response.text())
    except asyncio.TimeoutError:
        print("Timeout AIOHTTP")

if __name__ == '__main__':
    asyncio.run(request_requests())
    asyncio.run(request_aiohttp())

当我运行脚本时, requests 成功检索数据,但 aiohttp 始终超时。这两种方法都设置了 3 秒超时。

有趣的是,此问题发生在我正在使用的特定 URL 上。对于大多数其他 URL, requests aiohttp 按预期工作。

关于为什么 aiohttp 超时而 requests 没有超时的任何想法?我在这里缺少什么?


问题可能与为 aiohttp requests 设置的超时类型不同有关。 虽然两者都设置为 3 秒,但它们处理底层套接字操作的方式不同。

  • requests 中的 timeout 参数是一个 超时,涵盖连接建立、发送请求和接收响应的整个过程。

  • aiohttp 中的 aiohttp.ClientTimeout(total=3) 也是一个 超时,但它涵盖了所有请求步骤。 但是 ,如果服务器在初始连接后响应缓慢(例如,缓慢发送数据块), aiohttp 可能会在达到 total 超时之前超时。

出现问题的原因可能是目标服务器建立连接很快,但需要很长时间才能发送完整的响应。 requests 在这种情况下可以正常工作,因为它等待完整的 3 秒以获得任何响应,而 aiohttp 可能会在收到第一个数据块之前就超时。

可以尝试以下方法来解决此问题:

  1. 增加 aiohttp 超时: 尝试显著增加 aiohttp.ClientTimeout(total=...) ,例如 10 秒或更多,以查看问题是否出在服务器响应速度缓慢。

  2. 使用 aiohttp 中的单独连接和读取超时: aiohttp.ClientTimeout 允许指定单独的连接和读取超时。尝试设置更长的 sock_read 超时,该超时控制接收数据的最大时间:

python async with aiohttp.ClientSession( headers=headers, timeout=aiohttp.ClientTimeout(total=10, sock_read=5) ) as session: # ... 的代码 ...

  1. 检查代理和 DNS 解析: 确保的 aiohttp requests 请求都使用相同的网络配置(例如,代理设置、DNS 服务器)。差异可能会导致一种方法比另一种方法慢得多。

如果在尝试了这些步骤后问题仍然存在,请提供有关目标 URL 的更多上下文信息(如果可能)以及遇到的任何错误消息。这将有助于进一步诊断问题。

标签:python,python-3.x,python-requests,python-asyncio,aiohttp
From: 78830098

相关文章

  • Python中使用正则表达式
    摘要:正则表达式,又称为规则表达式,它不是某种编程语言所特有的,而是计算机科学的一个概念,通常被用来检索和替换某些规则的文本。一.正则表达式的语法①行定位符行定位符就是用来描述字符串的边界。"^"表示行的开始,"$"表示行的结束。^tm  #tmequalTomorrowMoon可以......
  • 如何在python中使用xarray打开grib2文件?
    将xarray导入为xr导入cfgrib导入生态码将pandas导入为pddata=xr.open_dataset(r"C:\Users\new\forecast_data.grib2",engine="cfgrib")这是我的代码。我只想使用xarray读取这个文件。错误是:无法识别的引擎cfgrib必须是以下之一:['netcdf4'、'scipy'、'......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • Python 请求 POST 请求与 websockets 库一起使用时挂起
    我使用Python中的requests库发送POST请求,同时维护与websockets库的WebSocket连接:importasyncioimportrequestsimportwebsocketsasyncdefwebsocket_handler(uri):asyncwithwebsockets.connect(uri)aswebsocket:whileTrue:me......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • [附开题]flask框架高校资产管理系统d8y3s(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育事业的快速发展,高校资产规模日益庞大,种类繁多,管理难度显著增加。传统的资产管理方式往往依赖于手工记录和纸质档案,不仅效率低......
  • [附开题]flask框架贺州图特产管理系统uuy79(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,这座历史悠久、文化底蕴深厚的城市,以其丰富的自然资源和独特的地理位置孕育了众多令人瞩目的特产。然而,在信息化快速发展的今天,贺州特......
  • [附开题]flask框架红枫超市会员管理系统ew5iq(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售行业的快速发展与消费者需求的日益多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响着顾客的购物体验......
  • PYTHON专题-(4)python叫你搞对象
    什么是面向过程编程?面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。什么是面向对象编程?面向对象编程——ObjectOrientedProgramming,简......
  • Python 基础教学:中文编码处理
    《Python基础教学:中文编码处理》在编程中,处理中文字符时经常会遇到编码问题。Python3默认使用UTF-8编码,但在处理文件、网络数据或与旧系统交互时,可能需要处理GBK、GB2312等其他编码。1.字符串的编码和解码在Python中,字符串(str)默认是Unicode编码。当你需要将......