本文最后更新于 2024年4月30日 下午
FastAPI性能测试
性能测试
代码:
1 2 3 4 5 6 7 8
| from fastapi import FastAPI
app = FastAPI()
@app.get("/") def root(): return {"message": "Hello World"}
|
结果:
1 2 3 4 5 6 7 8 9 10
| leonelgavin@Leonel-Gavin-MacBook-Air ~ % wrk -t20 -c1000 -d30s http://127.0.0.1:8000 Running 30s test @ http://127.0.0.1:8000 20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 130.29ms 24.32ms 381.62ms 81.29% Req/Sec 377.54 87.76 663.00 64.53% 225601 requests in 30.07s, 32.27MB read Socket errors: connect 0, read 25036, write 34, timeout 0 Requests/sec: 7503.51 Transfer/sec: 1.07MB
|
代码:
1 2 3 4 5 6 7 8
| from fastapi import FastAPI
app = FastAPI()
@app.get("/") async def root(): return {"message": "Hello World"}
|
结果:
1 2 3 4 5 6 7 8 9 10 11
| leonelgavin@Leonel-Gavin-MacBook-Air ~ % wrk -t20 -c1000 -d30s http://127.0.0.1:8000 Running 30s test @ http://127.0.0.1:8000 20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 63.87ms 70.67ms 1.99s 99.12% Req/Sec 718.26 196.99 1.85k 73.12% 429081 requests in 30.05s, 61.38MB read Socket errors: connect 0, read 6974, write 36, timeout 399 Requests/sec: 14278.10 Transfer/sec: 2.04MB leonelgavin@Leonel-Gavin-MacBook-Air ~ %
|
在本地通过wrk工具对FastAPI应用进行了测试。测试结果显示了在不同条件下的请求延迟、每秒请求数和数据传输速率。
第一次测试的结果显示:
- 平均延迟为130.29毫秒。
- 每秒请求数为377.54。
- 总请求数为225601,在30.07秒内处理。
- 数据传输速率为1.07MB/秒。
第二次测试的结果显示:
- 平均延迟为63.87毫秒。
- 每秒请求数为718.26。
- 总请求数为429081,在30.05秒内处理。
- 数据传输速率为2.04MB/秒。
可以看到,第二次测试的性能表现更好,平均延迟更低,每秒请求数更高,数据传输速率也更高。
在上述两段代码中,主要的区别在于使用了async关键字。async def定义的函数是异步函数,而不带async关键字的函数是同步函数。
在 Python 中,异步函数允许在等待 I/O 操作时释放控制权,从而允许在等待期间执行其他任务。这使得异步函数在处理高并发请求时能够更有效地利用系统资源,因为它们能够同时处理多个请求而不会被一个请求的阻塞影响。相比之下,同步函数在等待 I/O 操作时会阻塞当前线程,导致无法同时处理其他请求。
因此,使用异步函数可以提高 FastAPI 应用的性能,特别是在高并发场景下。异步函数的性能更好,因为它们能够更有效地处理请求,并且能够更好地利用系统资源。
async是Python语言中的一个关键字,用于定义异步函数。异步函数允许在等待 I/O 操作时释放控制权,以便执行其他任务。
FastAPI 并没有提供 async 这个关键字,它只是利用了 Python 中的异步特性来提供异步支持。因此,异步函数是 Python 语言自身提供的功能,而不是由 FastAPI 单独提供的。FastAPI 利用了 Python 的异步特性,使得我们可以轻松地编写异步的 Web 应用程序。