windwos 平台, flask 如何实现每一次 request 新开一个线程处理?

2020-02-10 22:16:36 +08:00
 black11black

新项目里 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 都新开辟线程。 有什么办法实现吗?还是我哪里设置错了 谢谢大家

1552 次点击
所在节点    问与答
7 条回复
rookiebulls
2020-02-10 22:35:00 +08:00
可以看看 gevent
creedowl
2020-02-11 00:23:35 +08:00
要不试试 golang
kidlj
2020-02-11 01:21:17 +08:00
golang, 每个 request 一个 goroutine。
gabon
2020-02-11 07:44:44 +08:00
线程池
2wex
2020-02-11 08:43:32 +08:00
用线程池

而且最好不要用 app.run ,这只是测试用的,可以用 gunicorn、WGSI 等
black11black
2020-02-12 07:06:41 +08:00
@2wex
谢谢回复,请问线程池配合 flask 怎么设置?

我服务预计部署在 win 平台上是需求决定的,不支持 gunicorn
black11black
2020-02-12 07:08:50 +08:00
@rookiebulls

我接触 py 的异步技术比较晚,基本是 py3.6 以后的事,在我看来要不然就多线程,要协程的话就用正统封装开发(或者一些定制封装 curio 之类的),我不能接受 gevent 这种神秘而不可控的东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX