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
maobukui
V2EX  ›  Python

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

  •  1
     
  •   maobukui · 2021-01-28 00:15:49 +08:00 · 2298 次点击
    这是一个创建于 1394 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于 flask 一直有个疑问,网上看了半天教程,没找到答案。

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

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

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

    • 是直接使用 python 标准的 threading 或者 multiprocessing 吗?
    • 还是说,flask 默认已经在并行处理了?

    感谢!

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

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

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

    还可以 celery (但会影响整个架构……
    iConnect
        5
    iConnect  
       2021-01-28 08:12:45 +08:00 via Android
    要看你的业务需求,进程 /线程之间要不要交换数据,实现的方案就差别大很多的。
    ebingtel
        6
    ebingtel  
       2021-01-28 08:55:54 +08:00
    把数据放到任务队列里面 起个后台服务去处理……多线程可以,但是 很难管理线程
    xiaolinjia
        7
    xiaolinjia  
       2021-01-28 09:28:13 +08:00
    我一般如果是小任务直接开个 threading.Thread 去跑,需要监控的任务就上 celery+flower 。
    hanssx
        8
    hanssx  
       2021-01-28 10:03:17 +08:00
    我之前也有相关疑问,后来看到别人的代码,可以提交到 ThreadPoolExecutor 用线程作为处理方案,或者用 apscheduler 做 job 调度,再或者用 celery 、dramatic 、arq 等异步框架,或者自己用 redis 或其他方法实现队列自己处理?
    PS:不知道为啥我这边 celery bug 多。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5343 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:32 · PVG 16:32 · LAX 00:32 · JFK 03:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.