aiohttp 异步http请求-12.aiohttp 请求生命周期(和requests库有什么不一样?)

2023-11-16

前言

aiohttp 请求生命周期对比requests库使用的区别

aiohttp 客户端 API

当你第一次使用 aiohttp 时,你会注意到一个简单的 HTTP 请求不是一次执行的,而是最多三个步骤:

async with aiohttp.ClientSession() as session:
    async with session.get('http://python.org') as response:
        print(await response.text())

当来自其他库时尤其出乎意料,例如非常流行的requests,其中”hello world”看起来像这样:

response = requests.get('http://python.org')
print(response.text)

那么为什么 aiohttp 片段如此冗长呢?

因为 aiohttp 是异步的,所以它的 API 旨在充分利用非阻塞网络操作。在这样的代码中,requests 会阻塞 3 次,并且是透明的,而 aiohttp 给了事件循环 3 次切换上下文的机会:

执行 时.get(),两个库都会向远程服务器发送 GET 请求。对于aiohttp,这意味着异步I/O,这里用一个标记,它可以保证它不仅不会阻塞,而且它已经干净地完成了。async with

在请求中执行response.text时,您只需读取一个属性。以阻塞方式调用.get()已经预加载和解码的整个响应负载。aiohttp 在.get()执行时仅加载标头,让您决定在第二个异步操作中支付之后加载正文的成本。因此.await response.text()

async with aiohttp.ClientSession()进入block时不执行I/O,但在结束时会确保所有剩余资源正确关闭。同样,这是异步完成的,必须这样标记。会话也是一种性能工具,因为它为您管理一个连接池,允许您重复使用它们,而不是在每个请求时打开和关闭一个新连接。您甚至可以通过传递连接器对象来管理池大小。

使用会话作为最佳实践

requests 库实际上也提供了一个会话系统。事实上,它可以让你做到:

with requests.Session() as session:
    response = session.get('http://python.org')
    print(response.text)

这不是默认行为,也没有在文档的早期宣传。正因为如此,大多数用户的性能都会受到影响,但可以很快开始黑客攻击。对于请求,这是一个可以理解的权衡,因为它的目标是成为“人类的 HTTP”,而在这种情况下,简单性总是比性能更重要。

但是,如果使用 aiohttp,则选择异步编程,这是一种进行相反权衡的范式:更冗长以获得更好的性能。因此库默认行为反映了这一点,鼓励您从一开始就使用性能最佳实践。

如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以 点这自行获取…

如何使用客户端会话?

默认情况下,该aiohttp.ClientSession对象将拥有一个最多具有 100 个连接的连接器,将其余连接放入队列中。这是一个相当大的数字,这意味着您必须同时连接到一百个不同的服务器(不是页面!),然后才能考虑您的任务是否需要资源调整。

事实上,您可以将会话对象想象为用户启动和关闭浏览器:每次您想要加载新选项卡时都这样做是没有意义的。

因此,您应该重用会话对象并从中发出许多请求。对于大多数脚本和中等大小的软件,这意味着您可以创建一个会话,并在程序的整个执行过程中重复使用它。您甚至可以将会话作为函数中的参数传递。例如,典型的“hello world”:

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:
            html = await response.text()
            print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

可以变成这样:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在更复杂的代码库上,您甚至可以创建一个中央注册表来保存来自代码中任何位置的会话对象,或者Client保存对它的引用的更高级别的类。

那么何时创建多个会话对象呢?当您需要更精细的资源管理时,就会出现这种情况:

您想通过通用配置对连接进行分组。

例如:

会话可以设置它们持有的所有连接共享的 cookie、标头、超时值等。

您需要多个线程并希望避免在它们之间共享可变对象。

您希望多个连接池从不同的队列中受益并分配优先级。

eg:

一个会话从不使用队列并且用于高优先级请求,另一个会话具有较小的并发限制和很长的队列,用于非重要请求。

如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以 点这自行获取…

优雅关闭

当在块ClientSession结束时 (或通过直接调用)关闭时,由于 asyncio 内部细节,底层连接保持打开状态。在实践中,底层连接将在片刻后关闭。但是,如果事件循环在底层连接关闭之前停止, 则会发出警告(启用警告时)。async withClientSession.close()ResourceWarning: unclosed transport

为了避免这种情况,必须在关闭事件循环之前添加一个小的延迟,以允许任何打开的底层连接关闭。

对于ClientSession没有 SSL 的情况,一个简单的零睡眠 ( ) 就足够了:await asyncio.sleep(0)

async def read_website():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://example.org/') as resp:
            await resp.read()

loop = asyncio.get_event_loop()
loop.run_until_complete(read_website())
# Zero-sleep to allow underlying connections to close
loop.run_until_complete(asyncio.sleep(0))
loop.close()

对于ClientSession使用 SSL,应用程序必须在关闭前等待一小段时间:

...
# Wait 250 ms for the underlying SSL connections to close
loop.run_until_complete(asyncio.sleep(0.250))
loop.close()

请注意,等待的适当时间量因应用程序而异。

如果这最终会在 asyncio 内部发生变化时变得过时,以便 aiohttp 本身可以等待底层连接关闭。

如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以 点这自行获取…

这里推荐下我自己建的软件测试交流学习Q群:746506216,群里都是学测试的,如果你想学或者正在学习测试相关内容 ,欢迎你加入,大家都是测试党,不定期分享干货(只有软件测试相关的),包括我自己整理的一份2022最新的Python自动化测试进阶资料和零基础教学,欢迎想进阶学习、感兴趣的小伙伴加入!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

aiohttp 异步http请求-12.aiohttp 请求生命周期(和requests库有什么不一样?) 的相关文章

随机推荐

  • UVA-140 带宽 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 把输入的这些结点进行一个全排列 然后找出带宽最少的组合 其实输入给出的数据量并不大 最多8个结点 不剪枝的话也就是8 个组合 应该
  • benchmark TPC-H postgreSQL

    写在前面 个人对TPCH benchma的理解 我接到这个任务的时候 描述是这样的 呀 用benchMarke生成TPC H然后测试一下 我第一反应就是benchMark是什么 TPCH是什么 现在把这个弄完一遍后来说一下我的理解 首先什么
  • windows查看WIFI无线网络密码

    方法一 通过查看无线属性查询 1 首先 点击电脑右下角的WiFi的图标 选择 打开网络和internet设置 或者选择打开设置 点击 更改适配器选项 2 选中无线网 查看此连接的状态 3 查看无线属性 4 然后选择上方的安全 选中显示字符
  • vue el-table 行排序 + 拖拽排序 简单粗暴

    1 行排序 HTML
  • mmdetection 报错 cats = self.dataset['categories'] KeyError: 'categories'

    如上图 报错 原因 coco训练集中没有categories字段 即数据集的标注json文件不对 解决方案 请参照coco数据集格式
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • PCL MeanShift点云聚类(C++详细过程版)

    目录 一 算法原理 1 原理概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 测试数据 本文由CSDN点云侠原创 爬虫网站请自重原文链接 一 算法原理 1 原理概述 均值漂移算法是一种非参数聚类技术 它不需要预先知道聚类的数
  • HTML、PHP实战:搭建一个网页登录页面。

    一 实验环境 MySQL5 7 26 FTP0 9 60 Apache2 4 39 我这里用的是PHPstudy小皮一键搭建的 数据库 二 登录页面 登录页面前端代码 文件名 denglu html
  • 人工智能学习笔记(一)Agent

    智能agent 开篇前言 agent的分类 1 简单反射agent 2 基于状态的反射agent 3 基于目标的agent 4 基于效用的agent 5 学习agent Exploration vs Exploitation 开篇前言 这段
  • 一文读懂什么是DHCP以及DHCP的功能特点

    随着企业中网络结构的日益复杂 接入终端的急剧增加 传统的IP分配方式已经无法满足日常工作需求 DHCP的出现有效解决了IP地址分配难题 本文中科三方针对什么是DHCP以及DHCP的功能特点做下介绍 什么是DHCP DHCP 全称Dynami
  • Python+Excel筛选未提交人员

    起因 学校给了表格让我们班长统计信息 可以用腾讯大大的TIM协作办公 让大家自己填 感觉方便了很多 然而 信息一旦变多而且顺序又没有固定 到后期想要知道未填信息的同学 这就难受了 只能找到班级名单 一个一个对照着找出未提交人员 日后此类事情
  • OCR入门教程系列(一):OCR基础导论

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • 【LVGL学习笔记】image图像相关接口

    数据结构如下 Data of image typedef struct lv obj t obj const void src 图像源 指向数组 文件或符号的指针 lv point t offset lv coord t w 宽度 lv c
  • 计算机硬盘模式,硬盘三种模式的含义-电脑自学网

    硬盘三种模式的含义 NORMAL 普通模式 是最早的IDE方式 以此方式访问BIOS和IDE控制器对参数不做任何转换 该模式支持的最大柱面数为1024 最大磁头数为16 最大扇区为63 每个扇区字节数为512 因此这种模式所支持的硬盘最大容
  • Open3D点云处理算法最全合集

    Open3D点云处理算法最全合集 致力于搜集可运行 可视化较好的Open3D算法 持续更新中 1 Open3D 点云读取及可视化 离群点去除 2 Open3D 点云体素格下采样 3 Open3D 点云KdTree建立 3种近邻搜索及结果可视
  • 系统开发与运行

    系统开发与运行 系统分析与设计 需求分析 需求工程 结构化分析与设计 测试基础知识 系统运行与维护 软件架构介绍 系统分析概述 系统分析是一种问题求解技术 它将一个系统分解成各个组成部分 目的是研究各个部分如何工作 交互 以实现其系统目标
  • set_new_handler(0)是什么意思?有什么用?

    出自 STL源码剖析 第45页中有一行代码set new handler 0 源代码 inline T allocate ptrdiff t size T std set new handler 0 T tmp T operator new
  • C#中File FileInfo 和Directory DirectoryInfo 类的区别

    老师在讲C 文件操作的时候讲的个类 功能类似 但用法有区别 他们都存在于systerm IO命名空间下 File和Directory的方法都是静态方法 FileInfo和DirectoryInfo的方法都是普通方法 老师建议是如果你要在某个
  • Python之PyAudio使用

    PyAudio 播放 录音 回放 回调方法播放 非阻塞回调 PyAudio 使用这个可以进行录音 播放 生成wav文件等等 播放 coding utf 8 引入库 import pyaudio import wave import sys
  • aiohttp 异步http请求-12.aiohttp 请求生命周期(和requests库有什么不一样?)

    前言 aiohttp 请求生命周期对比requests库使用的区别 aiohttp 客户端 API 当你第一次使用 aiohttp 时 你会注意到一个简单的 HTTP 请求不是一次执行的 而是最多三个步骤 async with aiohtt