V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zzping
V2EX  ›  Python

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

  •  
  •   zzping · 2021-01-15 10:41:10 +08:00 · 3758 次点击
    这是一个创建于 1445 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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()
    20 条回复    2021-01-16 18:13:12 +08:00
    xiaolinjia
        1
    xiaolinjia  
       2021-01-15 11:05:55 +08:00
    不知道你想干嘛,本身 flask 就是一个请求开一个线程去处理的,你自己内部又整一个线程池去处理干嘛
    zzping
        2
    zzping  
    OP
       2021-01-15 11:16:15 +08:00
    @xiaolinjia 你好,就是用户请求后,我返回一张二维码,然后我要检测用户是否扫描成功二维码。但是我要先返回给他二维码才能检测,我就想着再开个线程池去检测
    sudoy
        3
    sudoy  
       2021-01-15 11:38:55 +08:00   ❤️ 1
    试试 asyncio 看,下次在代码前后加 ``` 别人看起来也舒服点啊,开帖子的时候支持 markdown 的
    xiaolinjia
        4
    xiaolinjia  
       2021-01-15 11:41:54 +08:00   ❤️ 1
    @zzping submit 参数里的 func,不带括号。他 submit 内部会 call 他。
    yeqizhang
        5
    yeqizhang  
       2021-01-15 11:43:48 +08:00
    感觉你得重新理一下你的代码逻辑流程.. http 请求这样玩不合理...
    zzping
        6
    zzping  
    OP
       2021-01-15 11:53:22 +08:00
    @yeqizhang 好,谢谢
    zzping
        7
    zzping  
    OP
       2021-01-15 11:54:03 +08:00
    @xiaolinjia 汗,我弄掉
    zzping
        8
    zzping  
    OP
       2021-01-15 11:54:36 +08:00
    @sudoy 好,新人不太发帖,嘻嘻嘻,谢谢哈
    jswh
        9
    jswh  
       2021-01-15 11:59:55 +08:00
    executor.submit(get.yiqing.main()),这里错了吧,你直接调用函数,而不是去线程李调用
    smartwusir007
        10
    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
        11
    smartwusir007  
       2021-01-15 12:02:19 +08:00
    @smartwusir007 咦,怎么不行
    zzping
        12
    zzping  
    OP
       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
        13
    scukmh  
       2021-01-15 13:58:12 +08:00
    @smartwusir007 开帖子支持 markdown,回复不支持。
    yph007595
        14
    yph007595  
       2021-01-15 14:36:01 +08:00
    @zzping 你的环境有问题吧,我测试这个,马上返回
    treblex
        15
    treblex  
       2021-01-15 17:42:51 +08:00
    /qrCodeLogin //生成二维码给用户扫描
    /login //二维码地址,扫码打开之后 更新状态为已扫描待处理
    /xxxx //扫码的页面 点击按钮请求业务接口,更改状态为 扫码成功


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

    参考微信的那些东西 我是这么理解的,还没具体做过这种业务
    zzping
        16
    zzping  
    OP
       2021-01-15 19:30:40 +08:00
    @yph007595 我 window 和 linxu 都是一样的结果可能是我的问题 不过我找到办法了
    try:return "success"
    finally:time.sleep(1000)
    zzping
        17
    zzping  
    OP
       2021-01-15 19:31:25 +08:00
    @treblex 嗯大概是这样 谢谢
    tg3253
        18
    tg3253  
       2021-01-15 21:18:56 +08:00
    试试 gunicon eventlet 启动,多开几个线程
    neoblackcap
        19
    neoblackcap  
       2021-01-16 01:30:30 +08:00   ❤️ 1
    人家二维码扫码不是这样做的,你开三个接口去做吧。
    1. 接口返回二维码
    2. 提供一个轮训接口,然后前端轮训对应的接口就知道有没有扫描了,扫描之后结果怎么样
    3. 回调接口,接收回调的请求
    这样一整套下来,你就回到最基本的用 flask 写接口的流程上面。看你的问题,你根本就不了解 wsgi 跟 asyncio 那套东西的运行机制,及早回头吧
    zzping
        20
    zzping  
    OP
       2021-01-16 18:13:12 +08:00
    @neoblackcap 嗯谢谢,我还是得多研究研究
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1168 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 23:18 · PVG 07:18 · LAX 15:18 · JFK 18:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.