加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

aiohttp 并发测试web性能

发布时间:2020-12-17 17:00:39 所属栏目:Python 来源:网络整理
导读:aiohttp 并发测试web性能 import?asyncioimport?jsonfrom?aiohttp?import?ClientSession,?TCPConnectorfrom?datetime?import?datetime#?数据库配置HOST?=?'127.0.0.1'PORT?=?13306USER?=?'root'PASSWORD?=?'123456'DB?=?'testDB'CHARSET?=?'utf8'PASSWORD_LO

aiohttp 并发测试web性能

import?asyncio
import?json
from?aiohttp?import?ClientSession,?TCPConnector
from?datetime?import?datetime

#?数据库配置
HOST?=?'127.0.0.1'
PORT?=?13306
USER?=?'root'
PASSWORD?=?'123456'
DB?=?'testDB'
CHARSET?=?'utf8'
PASSWORD_LOGIN_REGISTER?=?"123456"

URL?=?'http://192.168.3.111:9999/api/v8/query/info/'


async?def?register_user(session,?i):
????start_time?=?datetime.now()
????h?=?{
????????"Content-Type":?"application/json"
????}
????payload?=?{
????????'session_key':?'s0lhvmq1odhxu6v7xf6xzdvzzsyiijtl',????????'type':?1,????????'pn':?1,????????'rn':?1,????????'text':?'刘',????}
????#?try:
????async?with?session.post(url=URL,?data=payload)?as?response:

????????r?=?await?response.read()

????????end_time?=?datetime.now()
????????cost?=?end_time?-?start_time
????????msg?=?"第{}个查询请求,开始时间:{},?花费时间:?{},?返回信息:?{}n".format(i,?start_time,?cost,?r.decode('unicode-escape'))
????????print("running?%d"?%?i,?datetime.now(),msg)
????#?except?Exception?as?e:
????#?????print("running?%d"?%?i)
????#?????msg?=?"%d出问题了"?%?i?+?str(e)?+?"n"
????with?open("log",?"a+",?encoding="utf-8")?as?f:
????????f.write(msg)


async?def?bound_register(sem,?session,?i):
????#?使用Semaphore,?它会在第一批2000个请求发出且返回结果(是否等待返回结果取决于你的register_user方法的定义)后
????#?检查本地TCP连接池(最大2000个)的空闲数(连接池某个插槽是否空闲,在这里,取决于请求是否返回)
????#?有空闲插槽,就PUT入一个请求并发出(完全不同于Jmeter的rame?up?in?period的线性发起机制).
????#?所以,在结果log里,你会看到第一批请求(开始时间)是同一秒发起,而后面的则完全取决于服务器的吞吐量
????async?with?sem:
????????await?register_user(session,?i)


async?def?run(num):
????tasks?=?[]
????#?Semaphore,?相当于基于服务器的处理速度和测试客户端的硬件条件,一批批的发
????#?直至发送完全部(下面定义的number/num)
????sem?=?asyncio.Semaphore(3000)
????#?创建session,且对本地的TCP连接不做限制limit=0
????#?超时时间指定
????#?total:全部请求最终完成时间
????#?connect:?aiohttp从本机连接池里取出一个将要进行的请求的时间
????#?sock_connect:单个请求连接到服务器的时间
????#?sock_read:单个请求从服务器返回的时间
????import?aiohttp
????#?timeout?=?aiohttp.ClientTimeout(total=300,?connect=60,?sock_connect=60,?sock_read=60)
????async?with?ClientSession(connector=TCPConnector(limit=0))?as?session:
????????for?i?in?range(0,?num):
????????????#?如果是分批的发,就使用并传递Semaphore
????????????task?=?asyncio.ensure_future(
????????????????bound_register(sem=sem,?session=session,?i=i))
????????????tasks.append(task)
????????responses?=?asyncio.gather(*tasks)
????????await?responses


start?=datetime.now()
number?=?380
loop?=?asyncio.get_event_loop()
future?=?asyncio.ensure_future(run(number))
loop.run_until_complete(future)
end?=?datetime.now()
total=end-start
with?open("log",?encoding="utf-8")?as?f:
????f.write('总耗时:{}秒,平均速度:{}秒n'.format(total,total/number))


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读