目录

背景

结论

测试数据

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