asyncio与gevent并发性能测试
asyncio与gevent并发性能测试
在对网站进行扫描或者暴破时需要对网站进行高并发操作,然而
requests
+concurrent
多线程性能上不太理想,了解到python用得比较多的并发库有asyncio
和gevent
,于是就有了如下测试。
0x00 协程
asyncio
和gevent
都是基于携程来进行并发操作的。协程也被称为微线程。
协程只是在单一的线程里进行切换不同的协程,因此无法使用多CPU能力,对于CPU密集型程序还是使用多进程比较好。
协程相比较进程和线程来说占用的内容更少,同样的线程切换更多的是靠操作系统来控制,而协程的执行则由我们自己控制。
并发原理:当其中一个协程遇到io等待时,将会切换到另一个协程继续运行。
0x01 grequests
grequests
是对requests
和gevent
库的封装
测试代码:
#!/usr/bin/python3.7
import grequests
import time
if __name__ == '__main__':
start = time.time()
greenlets = []
for _ in range(10):
greenlets.append(grequests.get("http://150.xx.xx.xx"))
rets = grequests.map(greenlets)
for ret in rets:
print(ret)
end = time.time()
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,所以它也支持回调函数:
def print_url(r, *args, **kwargs):
print(r.url)
res = grequests.get(url, callback=print_url)
测试结果:

0x02 asyncio + uvloop
由于gevent
的猴子补丁的缘故,requests
可以和gevent
结合使用,但是在不清楚内部实现的情况下,requests库经常比较容易出现Failed to establish a new connection:
的情况,在使用grequests库之后该情况得到解决。
uvloop是用Cython写的,目前不支持windows,它基于libuv.uvloop使得asyncio更快,基于性能的测试接近于go。
可以通过两种方式来使用uvloop:
import uvloop
import asyncio
#1. 通过设置策略
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
#2. 直接创建一个新的event_loop
asyncio.set_event_loop(uvloop.new_event_loop())
由于asycnio采用异步操作,它在使用的过程中所有的模块也都得是异步的,所以在进行http请求时也需要异步,即aiohttp
测试代码:
#!/usr/bin/python3.7
import asyncio
import aiohttp
import uvloop
import time
async def access_url(url):
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
async with session.get(url) as response:
status_code = response.status
print(status_code)
async def visit_async():
start = time.time()
tasks = []
for _ in range(10):
tasks.append(access_url("http://150.xx.xx.xx"))
await asyncio.gather(*tasks)
end = time.time()
print("asyncio visit_async tasks %.2f seconds" % (end - start))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(visit_async())
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop.run_until_complete(future)
测试结果:

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

参考:
- https://www.cnblogs.com/kxsph/p/9268774.html
- http://www.cnblogs.com/zhaof/p/7536569.html
- https://www.cnblogs.com/thomson-fred/p/10142226.html
- asyncio port scanner: https://gist.github.com/0xpizza/dd5e005a0efeb1edfc939d3a409e22d9
asyncio与gevent并发性能测试的更多相关文章
- ORM增删改查并发性能测试
这两天在对一些ORM进行性能测试(涉及SqlSugar.FreeSql.Fast.Framework.Dapper.LiteSql),测试用的是Winform程序,别人第一眼看到我的程序,说,你这测试 ...
- ORM增删改查并发性能测试2
前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...
- python异步编程之asyncio(百万并发)
前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最 ...
- jmeter如何玩之badboy + jmeter并发性能测试
今天下班时公司安排了一个同事来对项目做集群性能测试,怀着对性能测试的好奇心,下班后没有着急离开,而是等待 那位同事的到来,然后在旁边学习了下如何使用Badboy和jmeter做性能测试. 1. 软件介 ...
- 流畅的python第十八章使用asyncio包处理并发
对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...
- python 携程asyncio 实现高并发示例2
https://www.bilibili.com/video/BV1g7411k7MD?from=search&seid=13649975876676293013 import asyncio ...
- 30行代码搞定WCF并发性能测试
[以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main() { List< ...
- 如何使用jMeter对某个OData服务进行高并发性能测试
For project reason I have to measure the performance of OData service being accessed parallelly. And ...
- 流畅python学习笔记第十八章:使用asyncio包处理并发(二)
前面介绍了asyncio的用法.下面我们来看下如何用协程的方式来实现之前的旋转指针的方法 @asyncio.coroutine def spin(msg): write,flush=sys.stdou ...
随机推荐
- TCP的三次握手和四次挥手与路由器(三层)转发原理
传输层是国际标准化组织提出的开放系统互连(OSI)参考模型中的第四层.该层协议为网络端点主机上的进程之间提供了可靠.有效的报文传送服务.其功能紧密地依赖于网络层的虚拟电路或数据报服务.传输层定义了主机 ...
- linux文件权限命令chmod学习
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...
- 大数据之路week07--day04 (YARN,Hadoop的优化,combline,join思想,)
hadoop 的计算特点:将计算任务向数据靠拢,而不是将数据向计算靠拢. 特点:数据本地化,减少网络io. 首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征 ...
- 遇见zTree和chrome的俩坑
今天后台系统发现一bug,就是前几天用zTree做的树形结构,今下午突然不好使了,然后就查问题.我自己电脑装的是chrome浏览器,后台debug一看传的json数据,没毛病,想当然的断定不是数据的问 ...
- 转: java 双向map
package tools; import java.util.HashMap; public class DuplexMap<K,V> { class Entry{ K k; V v; ...
- css3多列布局瀑布流加载样式
看了一些网站的瀑布流加载,正好看到css3的多列属性,尝试着写了一个css做布局的瀑布流. 直接上代码: <!DOCTYPE html> <html lang="en&qu ...
- Mina学习+手写服务端+通过telnet连接服务端
1. 2. 3. 4.MinaServer.java package com.mina; import java.io.IOException;import java.net.InetSocketAd ...
- LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...
- UOJ450 【集训队作业2018】复读机【生成函数】
题目链接:UOJ EI神仙加强版 既然这题模数是今天日期减去\(7\times 10^5\),那就要赶紧把这题做了. 首先肯定是考虑指数型生成函数,列出来之后使用单位根反演一波. \[\begin{a ...
- windows下安装redis、celery,并启动测试
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现 搭建环境: Windows-x64 10 Celery 3.1.23 Celery-with-redis 3.0 Redi ...