新项目里 ui 要和后端频繁交互,确保线程上无阻塞各方面都会很方便。
网络服务方案就两种,要不然就 flask,要不然就 aiohttp, 以前用 asyncio 从传输层开始折腾过 rpc 框架,协程确实开发起来感觉考虑的问题很多。 我这个项目又没那么高性能需求,所以就选了开发快的 flask。
今天调研遇到一个问题,windows 平台没有 gunicorn,而 flask 自带的 server 设置到 threaded 模式后发现只实现了 router 之间无阻塞。
代码:
from flask import Flask
import time
app = Flask(__name__)
@app.route('/1')
def index():
return 'route 1 no block'
@app.route('/2')
def index2():
time.sleep(10)
return 'route 2 block 10s'
if __name__ == '__main__':
app.run(debug=True,threaded=True)
开启 threaded 后,行为表现是: 访问 /2,同时打开 /1,无阻塞。 访问 /2,同时再开一个 /2,第二个页面代码,会阻塞到第一个页面返回后才开始执行。
这个不符合我的需求,我希望每一次新的 request 都新开辟线程。 有什么办法实现吗?还是我哪里设置错了 谢谢大家
1
rookiebulls 2020-02-10 22:35:00 +08:00 via iPhone
可以看看 gevent
|
2
creedowl 2020-02-11 00:23:35 +08:00 via Android
要不试试 golang
|
3
kidlj 2020-02-11 01:21:17 +08:00 via iPhone
golang, 每个 request 一个 goroutine。
|
4
gabon 2020-02-11 07:44:44 +08:00 via Android
线程池
|
6
black11black OP |
7
black11black OP @rookiebulls
我接触 py 的异步技术比较晚,基本是 py3.6 以后的事,在我看来要不然就多线程,要协程的话就用正统封装开发(或者一些定制封装 curio 之类的),我不能接受 gevent 这种神秘而不可控的东西。 |