请问为什么我的 flask 异步不了,它不回调啊,调了好久

2021-01-15 10:41:10 +08:00
 zzping
from flask import Flask,request
import get
from wsgiref.simple_server import make_server
from concurrent.futures import ThreadPoolExecutor
app = Flask(__name__)
executor = ThreadPoolExecutor(2)
@app.route('/wx', methods=["GET", "POST"])
def getinput():
if (1):
executor.submit(get.yiqing.main()) # 异步内容
return "success" #不 return 啊 被上面那个异步阻塞了
if __name__ == '__main__':
server = make_server('', 8099, app)
server.serve_forever()
3546 次点击
所在节点    Python
20 条回复
xiaolinjia
2021-01-15 11:05:55 +08:00
不知道你想干嘛,本身 flask 就是一个请求开一个线程去处理的,你自己内部又整一个线程池去处理干嘛
zzping
2021-01-15 11:16:15 +08:00
@xiaolinjia 你好,就是用户请求后,我返回一张二维码,然后我要检测用户是否扫描成功二维码。但是我要先返回给他二维码才能检测,我就想着再开个线程池去检测
sudoy
2021-01-15 11:38:55 +08:00
试试 asyncio 看,下次在代码前后加 ``` 别人看起来也舒服点啊,开帖子的时候支持 markdown 的
xiaolinjia
2021-01-15 11:41:54 +08:00
@zzping submit 参数里的 func,不带括号。他 submit 内部会 call 他。
yeqizhang
2021-01-15 11:43:48 +08:00
感觉你得重新理一下你的代码逻辑流程.. http 请求这样玩不合理...
zzping
2021-01-15 11:53:22 +08:00
@yeqizhang 好,谢谢
zzping
2021-01-15 11:54:03 +08:00
@xiaolinjia 汗,我弄掉
zzping
2021-01-15 11:54:36 +08:00
@sudoy 好,新人不太发帖,嘻嘻嘻,谢谢哈
jswh
2021-01-15 11:59:55 +08:00
executor.submit(get.yiqing.main()),这里错了吧,你直接调用函数,而不是去线程李调用
smartwusir007
2021-01-15 12:01:47 +08:00
```python
from flask import Flask,request
import get
from wsgiref.simple_server import make_server
from concurrent.futures import ThreadPoolExecutor


app = Flask(__name__)
executor = ThreadPoolExecutor(2)


@app.route('/wx', methods=["GET", "POST"])
def getinput():
if (1):
executor.submit(get.yiqing.main()) # 异步内容
return "success" #不 return 啊 被上面那个异步阻塞了


if __name__ == '__main__':
server = make_server('', 8099, app)
server.serve_forever()
```
看着好别扭啊,我给格式化了一下,是这样吧
smartwusir007
2021-01-15 12:02:19 +08:00
@smartwusir007 咦,怎么不行
zzping
2021-01-15 12:06:57 +08:00
from flask import Flask,request
from wsgiref.simple_server import make_server
from concurrent.futures import ThreadPoolExecutor
import time

app = Flask(__name__)
executor = ThreadPoolExecutor(2)

def ceshi():
time.sleep(1000)

@app.route('/wx', methods=["GET", "POST"])
def getinput():
if (1):
executor.submit(ceshi)
return "success"
if __name__ == '__main__':
server = make_server('', 8099, app)
server.serve_forever()
怎么试都不行 都要等 time.sleep()后才会 return
scukmh
2021-01-15 13:58:12 +08:00
@smartwusir007 开帖子支持 markdown,回复不支持。
yph007595
2021-01-15 14:36:01 +08:00
@zzping 你的环境有问题吧,我测试这个,马上返回
treblex
2021-01-15 17:42:51 +08:00
/qrCodeLogin //生成二维码给用户扫描
/login //二维码地址,扫码打开之后 更新状态为已扫描待处理
/xxxx //扫码的页面 点击按钮请求业务接口,更改状态为 扫码成功


或者就是用 websocket 实时更新状态

参考微信的那些东西 我是这么理解的,还没具体做过这种业务
zzping
2021-01-15 19:30:40 +08:00
@yph007595 我 window 和 linxu 都是一样的结果可能是我的问题 不过我找到办法了
try:return "success"
finally:time.sleep(1000)
zzping
2021-01-15 19:31:25 +08:00
@treblex 嗯大概是这样 谢谢
tg3253
2021-01-15 21:18:56 +08:00
试试 gunicon eventlet 启动,多开几个线程
neoblackcap
2021-01-16 01:30:30 +08:00
人家二维码扫码不是这样做的,你开三个接口去做吧。
1. 接口返回二维码
2. 提供一个轮训接口,然后前端轮训对应的接口就知道有没有扫描了,扫描之后结果怎么样
3. 回调接口,接收回调的请求
这样一整套下来,你就回到最基本的用 flask 写接口的流程上面。看你的问题,你根本就不了解 wsgi 跟 asyncio 那套东西的运行机制,及早回头吧
zzping
2021-01-16 18:13:12 +08:00
@neoblackcap 嗯谢谢,我还是得多研究研究

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

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

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

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

© 2021 V2EX