目录
背景
结论
测试数据
0.1s时延
0.5s时延
1s时延
脚本
接口脚本
测试脚本
背景
准备写个批量下载脚本,需要确定用什么方式去实现较好,所以简单地去测试一下几种方式的性能。
一共对4种方案进行测试:线程、进程、协程、进程+协程
python版本:3.8
结论
一般情况首选协程,如果处理量比较大选择进程+协程方案
测试数据
0.1s时延
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 0.7664 | 100 | 0.1 | 5线程 |
多进程 | 3.8088 | 100 | 0.1 | 5进程 |
协程 | 0.2863 | 100 | 0.1 | |
多进程协程 | 3.6284 | 100 | 0.1 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 4.5293 | 1000 | 0.1 | 5线程 |
多进程 | 6.9434 | 1000 | 0.1 | 5进程 |
协程 | 1.7200 | 1000 | 0.1 | |
多进程协程 | 3.0589 | 1000 | 0.1 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 45.1084 | 10000 | 0.1 | 5线程 |
多进程 | 46.3299 | 10000 | 0.1 | 5进程 |
协程 | 14.4457 | 10000 | 0.1 | |
多进程协程 | 5.9303 | 10000 | 0.1 | 5进程 |
0.5s时延
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 2.4217 | 100 | 0.5 | 5线程 |
多进程 | 4.4481 | 100 | 0.5 | 5进程 |
协程 | 0.6240 | 100 | 0.5 | |
多进程协程 | 3.0846 | 100 | 0.5 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 21.5413 | 1000 | 0.5 | 5线程 |
多进程 | 23.0336 | 1000 | 0.5 | 5进程 |
协程 | 5.5589 | 1000 | 0.5 | |
多进程协程 | 3.2977 | 1000 | 0.5 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 207.5699 | 10000 | 0.5 | 5线程 |
多进程 | 205.9171 | 10000 | 0.5 | 5进程 |
协程 | 53.7818 | 10000 | 0.5 | |
多进程协程 | 13.0581 | 10000 | 0.5 | 5进程 |
1s时延
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 4.0859 | 100 | 1 | 5线程 |
多进程 | 6.8866 | 100 | 1 | 5进程 |
协程 | 1.1186 | 100 | 1 | |
多进程协程 | 3.3925 | 100 | 1 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 41.6542 | 1000 | 1 | 5线程 |
多进程 | 43.0518 | 1000 | 1 | 5进程 |
协程 | 10.5398 | 1000 | 1 | |
多进程协程 | 4.3463 | 1000 | 1 | 5进程 |
方式 | 用时(秒) | 请求次数 | 接口时延(秒) | 备注 |
多线程 | 407.1655 | 10000 | 1 | 5线程 |
多进程 | 407.9689 | 10000 | 1 | 5进程 |
协程 | 103.4981 | 10000 | 1 | |
多进程协程 | 23.9857 | 10000 | 1 | 5进程 |
脚本
接口脚本
from flask import jsonify, Flask, request
import time
app = Flask(__name__)
# 增加配置,支持中文显示
app.config['JSON_AS_ASCII'] = False
@app.route('/app', methods=['GET'])
def get_patient_advice():
time.sleep(0.5)
return "123"
if __name__ == '__main__':
app.run(
# 计算机名称不能为中文,否则会报错
host='0.0.0.0',
port=10086,
debug=True
)
测试脚本
import asyncio
import time
import requests
from multiprocessing.pool import ThreadPool
from multiprocessing import Pool
import aiofiles
import aiohttp
def t(n):
url="http://127.0.0.1:10086/app"
requests.get(url)
async def tt(n):
url = "http://127.0.0.1:10086/app"
await n.get(url)
def 普通():
for n in range(1000):
t(n)
def 多线程():
with ThreadPool(processes=5) as pool:
pool.starmap(t,[(n,) for n in range(20)])
def 多进程():
with Pool(5) as pool:
pool.starmap(t,[(n,) for n in range(20)])
async def 协程():
loop=asyncio.get_event_loop()
async with aiohttp.ClientSession(loop=loop) as session:
tasks=[asyncio.ensure_future(tt(session)) for _ in range(100)]
await asyncio.gather(*tasks)
def 多进程协程():
with Pool(5) as pool:
pool.apply(start)
async def 协程1():
loop=asyncio.get_event_loop()
async with aiohttp.ClientSession(loop=loop) as session:
tasks=[asyncio.ensure_future(tt(session)) for _ in range(20)]
await asyncio.gather(*tasks)
def start():
asyncio.run(协程1())
if __name__ == '__main__':
# t1=time.perf_counter()
# 普通()
# t2=time.perf_counter()
# print(f"用时:{t2-t1}")
t3=time.perf_counter()
多线程()
t4=time.perf_counter()
print(f"多线程用时:{t4-t3}")
t5 = time.perf_counter()
多进程()
t6 = time.perf_counter()
print(f"多进程用时:{t6 - t5}")
t7 = time.perf_counter()
asyncio.run(协程())
t8 = time.perf_counter()
print(f"协程用时:{t8 - t7}")
t9 = time.perf_counter()
多进程协程()
t10 = time.perf_counter()
print(f"多进程协程用时:{t10 - t9}")