python 多线程、多进程、协程网络性能对比

目录

背景

结论

测试数据

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}")



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值