flask 是一个框架,视图函数中的操作默认应该是单线程的吧?通过框架开启多线程或者多进程,那只是对于请求而言,即多个请求同时过来,开启了并行处理,而针对某个请求,内部想开启多线程或多进程该怎么处理? 例如:
@app.route("/login", methods=["GET"])
def w_login():
handler_A()
handler_B()
return AB
上述场景下,希望拿到特定请求后,handler_A (耗时) 和 handler_B 同时执行,而不是顺序执行。
感谢!
1
LeeReamond 2021-01-28 00:21:49 +08:00 via Android
这种情况下不会默认并行,如果是的话属于打破 python 解释规则的行为,很颠覆。需要用户自行处理线程,并且注意 gil
|
2
lolizeppelin 2021-01-28 00:27:59 +08:00
HTTP 服务就干符合 http 协议的事
写成异步接口 返回任务 id rpc 丢到后面服务器干这事 结果从任务 id 拿 |
3
lewinlan 2021-01-28 00:34:28 +08:00 via Android
想开就开呗,join 就是了
|
4
no1xsyzy 2021-01-28 01:35:18 +08:00 1
自行处理线程或者进程。但不推荐 multiprocessing,这似乎会(或者很容易会)重建整个框架(重新 create_app )。
还可以 celery (但会影响整个架构…… |
5
iConnect 2021-01-28 08:12:45 +08:00 via Android
要看你的业务需求,进程 /线程之间要不要交换数据,实现的方案就差别大很多的。
|
6
ebingtel 2021-01-28 08:55:54 +08:00
把数据放到任务队列里面 起个后台服务去处理……多线程可以,但是 很难管理线程
|
7
xiaolinjia 2021-01-28 09:28:13 +08:00
我一般如果是小任务直接开个 threading.Thread 去跑,需要监控的任务就上 celery+flower 。
|
8
hanssx 2021-01-28 10:03:17 +08:00
我之前也有相关疑问,后来看到别人的代码,可以提交到 ThreadPoolExecutor 用线程作为处理方案,或者用 apscheduler 做 job 调度,再或者用 celery 、dramatic 、arq 等异步框架,或者自己用 redis 或其他方法实现队列自己处理?
PS:不知道为啥我这边 celery bug 多。 |