线程是操作系统层面的“并行”, 协程是应用程序层面的“并行”。

协程本质上就是:提供一个环境,保存一些需要等待的任务,当这些任务可以执行(等待结束)的时候,能够执行。再等待的过程中,程序可以执行别的任务。

asyncio是python3.4版本引入到标准库因此要注意python版本

我的python环境

Python 3.6. (v3.6.5:f59c0932b4, Mar  , ::) [MSC v.  bit (Inte
l)] on win32
Type "help", "copyright", "credits" or "license" for more information.

平时做接口测试都是使用requests,但是requests是同步的库,如果想异步的话需要引入aiohttp

  • 安装aiohttp模块
pip install aiohttp
  • 关键字async 、await(python3.5开始引入)

async 是明确将函数声明为协程的关键字,函数执行也会返回一个协程对象(async关键字可以定义一个协程对象,被async修饰的函数变成了一个协程对象而不是一个普通的函数)(python3.4是使用装饰器@asyncio.coroutine)

await  在协程函数内部,可以在某个表达式之前使用这个关键字来挂起协程,执行别的协程(python3.4是使用yield from)

直接调用异步函数不会返回结果,而是返回一个coroutine对象

可以通过await语法来挂起自身的协程,并等待另一个协程完成直到返回结果

  • 关键字async with(参考whith的作用:https://www.cnblogs.com/DswCnblog/p/6126588.html)

Aiohttp推荐使用ClientSession作为主要的接口发起请求。ClientSession允许在多个请求之间保存cookie以及相关对象信息。Session(会话)在使用完毕之后需要关闭,关闭Session是另一个异步操作,所以每次你都需要使用async with关键字,这样就不需要单独再去关闭了

import asyncio
import time
from aiohttp import ClientSession
#async英文为异步的+io操作
url = 'http://127.0.0.1:505?c=1&d=2'
#url = 'http://10.21.21.248:8002/sr_sys/v1/user/list' now = lambda: time.time()
async def req_get(url):
async with ClientSession() as session:
async with session.get(url) as response:
response = await response.read()
#print(response,type(response))
async def req_post(url):
async with ClientSession() as session:
async with session.post(url) as response:
response = await response.read() if __name__ == '__main__':
start = now()
#方法可以创建一个事件循环,asyncio.BaseEventLoop。
#协程对象不能直接运行,在注册事件循环的时候,其实是run_until_complete方法将协程包装成为了一个任务(task)对象。
#所谓task对象是Future类的子类。保存了协程运行后的状态,用于未来获取协程的结果
loop = asyncio.get_event_loop()
#需要处理的任务
tasks = [asyncio.ensure_future(req_get(url)) for i in range(512)]
#tasks = [loop.create_task(req_get(url)) for i in range(512)] 确定参数是协程的时候可以用这个
#将协程注册到事件循环,并启动事件循环
#loop.run_until_complete(asyncio.gather(*tasks))
loop.run_until_complete(asyncio.wait(tasks))
for task in tasks:
print(task)
print('Task ret: ', task.result())
print('TIME: ', now() - start)

aiohttp库的一些方法具体使用可以参考:https://blog.csdn.net/biheyu828/article/details/87896507

①相关概念的理解: 

  • event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
  • coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。
  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别
  • async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

耗时的操作一般是一些IO操作,例如网络请求,文件读取等。我们可以使用asyncio.sleep函数来模拟IO操作。协程的目的也是让这些IO操作异步化。

②ensure_future()  asyncio.BaseEventLoop.create_task asyncio.Task三者的区别和取舍:

ensure_future 除了接受 coroutine 作为参数,还接受 future 作为参数。

看 ensure_future 的代码,会发现 ensure_future 内部在某些条件下会调用 create_task,综上所述:

  • encure_future: 最高层的函数,推荐使用,除了接受coroutine 作为参数,还接受 future 作为参数,返回一个task
  • create_task: 在确定参数是 coroutine 的情况下可以使用,因为它只接受协程程序。
  • Task: 可能很多时候也可以工作,但真的没有使用的理由!

参考文档:

https://www.sohu.com/a/74542662_218897

https://www.cnblogs.com/shenh/p/9090586.html

https://blog.csdn.net/hanglinux/article/details/75068400

https://www.cnblogs.com/zhaof/p/8490045.html

aiohttp

使用python asyncio+aiohttp做接口测试(TODO)的更多相关文章

  1. Python使用asyncio+aiohttp异步爬取猫眼电影专业版

    asyncio是从pytohn3.4开始添加到标准库中的一个强大的异步并发库,可以很好地解决python中高并发的问题,入门学习可以参考官方文档 并发访问能极大的提高爬虫的性能,但是requests访 ...

  2. python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

    简介 上一篇和大家一起科普扫盲接口后,知道什么是接口,接口类型等,对其有了大致了解之后,我们就回到主题-接口测试. 什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统 ...

  3. Python学习---IO的异步[asyncio +aiohttp模块]

    aiohttp aiohttp是在asyncio模块基础上封装的一个支持HTTP请求的模块,内容比8.4.2[基于asyncio实现利用TCP模拟HTTP请求]更全面 安装aiohttp: pip3 ...

  4. postman+jenkins+newman做接口测试的持续集成

    为何要做接口自动化测试的持续集成? 1. 接口相对稳定,改动少,比起GUI自动化测试来说性价比更加高些,不容易出现GUI自动化那种掉到维护脚本的坑里. 2. 接口测试比较简单,一个规范的接口,测试只需 ...

  5. 使用Robot Framework做接口测试

    http://chuansong.me/n/1858477 1.RF框架 1.1 RF框架介绍Robot Framework 框架是一个通用的测试框架,一直是由诺西网络(Nokia Siemens N ...

  6. 基于python的直播间接口测试实战 详解结合项目

    基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...

  7. 使用robotframework做接口测试5——一个用例中调多个接口

    凡是涉及一点点有接口关联的,都可能下一个接口需要上一个接口的某个返回值作为入参,最直接的例子,就是登录依赖.用接口做业务性的测试,也绝对离不开接口依赖的,业务都是一系列接口串联的结果,有时候一个接口操 ...

  8. 使用robotframework做接口测试4——搞定接口签名及密码加密

    接口签名是我做接口测试撞到的第一块石头,刚到新公司,本来想默默憋出来一个大招,然后碰到了签名接口,直接给跪了.于是只好找开发哥哥帮忙,把签名算法的java文件拿到,一行行对着用python实现了一遍. ...

  9. 使用robotframework做接口测试二——处理响应数据

    初使用RequestsLibrary做接口测试时,你会不会感到困惑,为什么会有${resp.content}, ${resp.status_code}这样的写法,这个status_code什么鬼,f5 ...

随机推荐

  1. 提交中文数据乱码问题---web.xml

    前端时间,做了个纯springmvc框架的一个后台系统,遇到了不少问题.特别是编码问题,让我纠结了很久.每次ajax传入数据的时候需要将form中的数据先进行编码 encodeURI(AA); 利用a ...

  2. windows的磁盘操作之七——获取当前所有的物理磁盘号 加备注

     windows的磁盘操作之七--获取当前所有的物理磁盘号 2011-07-28 17:47:56 标签:windows API DeviceIoControl 物理磁盘 驱动器号 原创作品,允许转载 ...

  3. pip3 Traceback (most recent call last)错误调试

    百度找的答案不知道是否正确反正不适用于deepin,就手动调试了一下,结果修复了原理不清楚. 调试环境: OS:deepin 15.11 Python3-pip 错误提示: python@python ...

  4. vue-小爱ADMIN系列文章(二):微信微博等分享,国际化,前端性能优化,nginx服务器部署

    最近在做我的小爱ADMIN后台管理系统,结合当前市场后台管理系统对相关功能的需求,我又开始新增了一些新的功能和组件,如分享功能组件,项目国际化功能:项目完成后,部署在nginx服务器,发现首次访问的速 ...

  5. python学习——函数参数

    一.为什么要使用函数 函数能提高应用的模块性,和代码的重复利用率. 二.函数的参数 位置参数:从左至右进行匹配 一般情况,也就是我们迄今为止最常用的方法,是通过位置进行匹配把参数值传递给函数头部的参数 ...

  6. Unity之与Web的交互

    一.下载,安装,配置,启动Apache 1.进入官网下载Apache 2.解压到根目录 3.记事本打开如下配置文件 4.安装apache 5.出现错误:(该错误是由于端口被占用引起的) 6.修改配置文 ...

  7. 09_if条件语句的使用

    1.条件语句是用来判断给定的条件是否满足(表达式值是否为0),并根据判断的结果(真或假)决定执行的语句2.go语言和C语言的条件语句在语法格式上大体相似,但是还是有略微的不同,具体的细节如下 例子:p ...

  8. Vue+webpack项目的多环境打包配置

    背景:由于需要将应用部署到线上开发环境.线上测试环境.线上预发环境.线上生产环境,而每个环境的访问地址是不同的.如果每次更改请求地址未免有些繁琐,就考虑在本地进行一次性配置. 代码管理工具:git 代 ...

  9. 洛谷 P3627 【抢掠计划】

    题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...

  10. NLP(二十) 利用词向量实现高维词在二维空间的可视化

    准备 Alice in Wonderland数据集可用于单词抽取,结合稠密网络可实现其单词的可视化,这与编码器-解码器架构类似. 代码 from __future__ import print_fun ...