asyncio与gevent并发性能测试

在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而requests+concurrent多线程性能上不太理想,了解到python用得比较多的并发库有asynciogevent,于是就有了如下测试。

0x00 协程

asynciogevent都是基于携程来进行并发操作的。协程也被称为微线程。
协程只是在单一的线程里进行切换不同的协程,因此无法使用多CPU能力,对于CPU密集型程序还是使用多进程比较好。
协程相比较进程和线程来说占用的内容更少,同样的线程切换更多的是靠操作系统来控制,而协程的执行则由我们自己控制。
并发原理:当其中一个协程遇到io等待时,将会切换到另一个协程继续运行。

0x01 grequests

grequests是对requestsgevent库的封装
测试代码:

  1. #!/usr/bin/python3.7
  2. import grequests
  3. import time
  4. if __name__ == '__main__':
  5. start = time.time()
  6. greenlets = []
  7. for _ in range(10):
  8. greenlets.append(grequests.get("http://150.xx.xx.xx"))
  9. rets = grequests.map(greenlets)
  10. for ret in rets:
  11. print(ret)
  12. end = time.time()
  13. print("grequests visit_async tasks %.2f seconds" % (end - start))

grequests.map()参数说明:
def grequests.map(requests, stream=False, size=None, exception_handler=None, gtimeout=None)

参数 说明 备注
size 协程的并发度(相当于线程数) 当一个协程在IO等待时,会将CPU交给其他协程
exception_handler 异常处理函数 用于处理单个请求出现异常的函数
gtimeout 设置所有请求的超时时间  

grequests的底层是request,所以它也支持回调函数:

  1. def print_url(r, *args, **kwargs):
  2. print(r.url)
  3. res = grequests.get(url, callback=print_url)

测试结果:

 
grequsts并发性能测试

0x02 asyncio + uvloop

由于gevent的猴子补丁的缘故,requests可以和gevent结合使用,但是在不清楚内部实现的情况下,requests库经常比较容易出现Failed to establish a new connection:的情况,在使用grequests库之后该情况得到解决。
uvloop是用Cython写的,目前不支持windows,它基于libuv.uvloop使得asyncio更快,基于性能的测试接近于go。
可以通过两种方式来使用uvloop:

  1. import uvloop
  2. import asyncio
  3. #1. 通过设置策略
  4. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
  5. #2. 直接创建一个新的event_loop
  6. asyncio.set_event_loop(uvloop.new_event_loop())

由于asycnio采用异步操作,它在使用的过程中所有的模块也都得是异步的,所以在进行http请求时也需要异步,即aiohttp
测试代码:

  1. #!/usr/bin/python3.7
  2. import asyncio
  3. import aiohttp
  4. import uvloop
  5. import time
  6. async def access_url(url):
  7. async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
  8. async with session.get(url) as response:
  9. status_code = response.status
  10. print(status_code)
  11. async def visit_async():
  12. start = time.time()
  13. tasks = []
  14. for _ in range(10):
  15. tasks.append(access_url("http://150.xx.xx.xx"))
  16. await asyncio.gather(*tasks)
  17. end = time.time()
  18. print("asyncio visit_async tasks %.2f seconds" % (end - start))
  19. if __name__ == '__main__':
  20. loop = asyncio.get_event_loop()
  21. future = asyncio.ensure_future(visit_async())
  22. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
  23. loop.run_until_complete(future)

测试结果:

 
asyncio 并发性能测试

0x03 优缺点

asyncio由于是异步操作,且代码库生态不够完善,部分异步代码库存在问题可能查不到,且编写代码时行数较多,影响阅读,而且代库函数全部重构,上手有难度,但是并发执行的速度较快,对于暴破、端口扫描等比较适用。
gevent采用了requests模块,在使用了猴子补丁后对于扫描网站路径等可以有效即时针对扫描结果进行深层扫描。

请求内容:

 
请求内容

参考:

 
 

asyncio与gevent并发性能测试的更多相关文章

  1. ORM增删改查并发性能测试

    这两天在对一些ORM进行性能测试(涉及SqlSugar.FreeSql.Fast.Framework.Dapper.LiteSql),测试用的是Winform程序,别人第一眼看到我的程序,说,你这测试 ...

  2. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...

  3. python异步编程之asyncio(百万并发)

      前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最 ...

  4. jmeter如何玩之badboy + jmeter并发性能测试

    今天下班时公司安排了一个同事来对项目做集群性能测试,怀着对性能测试的好奇心,下班后没有着急离开,而是等待 那位同事的到来,然后在旁边学习了下如何使用Badboy和jmeter做性能测试. 1. 软件介 ...

  5. 流畅的python第十八章使用asyncio包处理并发

    对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...

  6. python 携程asyncio 实现高并发示例2

    https://www.bilibili.com/video/BV1g7411k7MD?from=search&seid=13649975876676293013 import asyncio ...

  7. 30行代码搞定WCF并发性能测试

    [以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main()         {               List< ...

  8. 如何使用jMeter对某个OData服务进行高并发性能测试

    For project reason I have to measure the performance of OData service being accessed parallelly. And ...

  9. 流畅python学习笔记第十八章:使用asyncio包处理并发(二)

    前面介绍了asyncio的用法.下面我们来看下如何用协程的方式来实现之前的旋转指针的方法 @asyncio.coroutine def spin(msg): write,flush=sys.stdou ...

随机推荐

  1. Python 使用 docopt 解析json参数文件

    1. 背景 在深度学习的任务中,通常需要比较复杂的参数以及输入输出配置,比如需要不同的训练data,不同的模型,写入不同的log文件,输出到不同的文件夹以免混淆输出 常用的parser.add()方法 ...

  2. Redis未授权漏洞检测工具

    Redis未授权检测小工具 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ @Author: r0cky @Time: 20 ...

  3. What Does Reconciliation Mean in Accounting

    Account reconciliation is the process of comparing transactions you have recorded using internal rec ...

  4. P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]

    题目来源:洛谷 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描 ...

  5. Vue实现一个图片懒加载插件(转载)

    Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: &l ...

  6. 7月新的开始 - Axure学习04 - 发布与预览、菜单和表格元件、流程图和连接点、标记元件

    Axure 的发布与预览 1.发布 2.生成html文件 常规:指定浏览器.工具栏的生成 页面.页面说明.元件说明.交互.标志(logo和描述).字体.移动设备等 3.发布到Axshare Axure ...

  7. logging 为全局的日志工具对象添加日志记录器

    def log_file(LEVEL_NAME): # 设置日志的记录等级,常见的有四种,大小关系如下,DEBUG < INFO < WARNING <ERROR # 一旦设置级别, ...

  8. fsLayuiPlugin入门使用

    简介 源码下载后,不能直接打开,必须运行在容器下,例如:nginx.tomcat.jetty等容器. 源码中默认配置了nginx容器,可以直接启动nginx访问. 本文主要介绍下载源码后的使用,避免在 ...

  9. jquery判断两次密码不一致

    jquery检测输入密码两次不一样提示 输入密码: <input type="password" name="password1" id="pa ...

  10. The 2019 China Collegiate Programming Contest Harbin Site I. Interesting Permutation

    链接: https://codeforces.com/gym/102394/problem/I 题意: DreamGrid has an interesting permutation of 1,2, ...