2024-09-01
Python
00

目录

1 Flask 路由阻塞
2 requests访问
3 FastAPI 路由阻塞
4 总结:同步并发 异步并发
参考

1 Flask 路由阻塞

当启动一个Flask APP如下,在同一浏览器开2个窗口访问这个服务(我的是http://172.18.43.32:8001/hello),前一个请求没返回时,另外一个窗口的相同请求不会有反应。

这是浏览器的锅,同一请求会顺序执行,此时可以用同一台电脑的不同浏览器测试,可以发现不会存在路由阻塞。

python
import time from flask import Flask app = Flask(__name__) @app.route('/hello') def hello_world(): print("receive !") time.sleep(20) return 'Hello World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=8001)

2 requests访问

  • 换个方式,使用requests访问,线程池中100个线程同时执行访问:
python
import requests from concurrent.futures import ThreadPoolExecutor def task(): res = requests.request(method="GET", url="http://172.18.43.32:8001/hello", timeout=None) executor = ThreadPoolExecutor(max_workers=100) for i in range(100): executor.submit(task)

还是可以看见不会阻塞。

3 FastAPI 路由阻塞

下面的情况下,访问就会阻塞。

python
# -*- coding:utf-8 -*- import asyncio import time import uvicorn from fastapi.middleware.cors import CORSMiddleware from fastapi import FastAPI, File, Form, UploadFile import cv2 import numpy as np app = FastAPI( title='FastAPI Tutorial', description='FastAPI教程', version='1.0.0', docs_url='/docs', redoc_url='/redocs', ) @app.get("/hello") async def hl(): print("receive !") time.sleep(20) return { "token": "ads" } def fastweb(): uvicorn.run('deal:app', host='0.0.0.0', port=8001, reload=False, debug=False, workers=1) if __name__ == '__main__': fastweb()

原因:在async标识的函数中使用同步方法time.sleep(20),这导致了一个异步程序之间的同步问题,出现了错误!这种写法本身就是错误的,加async 是想利用Python的协程机制 将路由变成异步请求, 进一步提高并发量!只要考虑加async ,那么就得好好设计函数内部, 多用一些异步方法,比如可以写成:

python
@app.get("/hello") async def hl(): print("receive !") await asyncio.sleep(20) return { "token": "ads" }

设计合理就会极大利用起协程异步,从而极大提高并发量,设计不合理就是呆瓜。若是分不清,还是老老实实和Flask一样写法:

python
@app.get("/hello") def hl(): print("receive !") time.sleep(20) return { "token": "ads" }

这样也是出现不了路由阻塞的。

4 总结:同步并发 异步并发

1 Flask 中的属于同步并发,可以无阻塞访问!但要注意别让浏览器欺骗你!

2 FastAPI 支持异步框架,支持是支持,前提是你得用好它,不然就呆瓜。用好了并发量就提升了!

3 FastAPI 中同样支持Flask 那样子的同步并发,和Flask 一样一样的,但要注意写法!

4 FastAPI 貌似比 Flask 更强大!

参考

java web

golang 协程

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!