[ Python ]关于 flask 视图函数中需要多线程 or 多进程的实现

2021-01-28 00:15:49 +08:00
 maobukui
对于 flask 一直有个疑问,网上看了半天教程,没找到答案。

flask 是一个框架,视图函数中的操作默认应该是单线程的吧?通过框架开启多线程或者多进程,那只是对于请求而言,即多个请求同时过来,开启了并行处理,而针对某个请求,内部想开启多线程或多进程该怎么处理? 例如:

@app.route("/login", methods=["GET"])
    def w_login():
        handler_A()
        handler_B()
    
    	return AB

上述场景下,希望拿到特定请求后,handler_A (耗时) 和 handler_B 同时执行,而不是顺序执行。

感谢!

2321 次点击
所在节点    Python
8 条回复
LeeReamond
2021-01-28 00:21:49 +08:00
这种情况下不会默认并行,如果是的话属于打破 python 解释规则的行为,很颠覆。需要用户自行处理线程,并且注意 gil
lolizeppelin
2021-01-28 00:27:59 +08:00
HTTP 服务就干符合 http 协议的事

写成异步接口 返回任务 id
rpc 丢到后面服务器干这事

结果从任务 id 拿
lewinlan
2021-01-28 00:34:28 +08:00
想开就开呗,join 就是了
no1xsyzy
2021-01-28 01:35:18 +08:00
自行处理线程或者进程。但不推荐 multiprocessing,这似乎会(或者很容易会)重建整个框架(重新 create_app )。

还可以 celery (但会影响整个架构……
iConnect
2021-01-28 08:12:45 +08:00
要看你的业务需求,进程 /线程之间要不要交换数据,实现的方案就差别大很多的。
ebingtel
2021-01-28 08:55:54 +08:00
把数据放到任务队列里面 起个后台服务去处理……多线程可以,但是 很难管理线程
xiaolinjia
2021-01-28 09:28:13 +08:00
我一般如果是小任务直接开个 threading.Thread 去跑,需要监控的任务就上 celery+flower 。
hanssx
2021-01-28 10:03:17 +08:00
我之前也有相关疑问,后来看到别人的代码,可以提交到 ThreadPoolExecutor 用线程作为处理方案,或者用 apscheduler 做 job 调度,再或者用 celery 、dramatic 、arq 等异步框架,或者自己用 redis 或其他方法实现队列自己处理?
PS:不知道为啥我这边 celery bug 多。

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

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

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

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

© 2021 V2EX