请教下, flask 中的任务如何用多线程/多进程处理(能提高处理器利用效率的方法都行) - V2EX
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
asd648299819
V2EX    Python

请教下, flask 中的任务如何用多线程/多进程处理(能提高处理器利用效率的方法都行)

  •  
  •   asd648299819 2020-03-09 17:15:48 +08:00 6346 次点击
    这是一个创建于 2047 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这几天在学习怎么用 flask 搭建一个 api,现在成功搭建了,但是对系统性能的利用率让我有点不满意,每秒只能处理三个请求,但是 cpu 的利用率还没到 20%,内存占用也十分低,所以我感觉应该是单线程 /单进程的锅


    我从一开始的直接 app.run 到后来的使用 gevent.pywsgi 中的 WSGIServer 再到使用 gunicorn 开启多进程和多线程,性能利用率一直不超过 30%,所以很让我纠结,特此来请教一下大佬们

    screen gunicorn --threads 8 -w 3 -b 0.0.0.0:2333 flask_test:app 

    这是我的 gunicorn 启动代码,但是实测跟用 WSGIServer 的性能差不多。


    以下是我程序的代码

    @app.route('/api', methods=['POST']) def post(): a = request.form['a'] b = request.form['b'] try: caculate = api.Caculate(a, b) result, time = caculate.start() recognize_info = {'time': time, 'result': result, 'success': 1} return jsonify(recognize_info), 200 except: recognize_info = {'message': '计算程序出错', 'success': 0} return jsonify(recognize_info), 200 

    主要花费的时间都在计算那一步,所以我在想有没有什么方法可以在 flask 的任务里使用多线程,目前我的想法是使用 queue 队列,但是不知道该如何对应返回,请大佬们讲解讲解

    16 条回复    2020-04-12 22:28:21 +08:00
    tmackan
        1
    tmackan  
       2020-03-09 17:34:00 +08:00
    性能利用率一直不超过 30%?? 你压测没到极限吧?
    flask 多任务?flask 可以和 celery 结合

    api 服务的话,一般都是
    1.调 wsgi 配置
    2.业务优化 比如增加缓存
    3.加机器配置

    py 高并发其实一般,qps1500 已经很多了
    misaka19000
        2
    misaka19000  
       2020-03-09 17:40:17 +08:00
    你是怎么压测的?
    RedisMasterNode
        3
    RedisMasterNode  
       2020-03-09 18:25:31 +08:00
    运行期间 ps 检查进程情况,判断是否正常”运行“
    压测期间 top 检查进程占用资源的情况
    运行没有问题的话检查每个进程占用了多少资源,其实你写明--threads 8,你的机器是什么样的配置?每个进程处理请求可以让单个进程跑到 100%吗?如果单个可以再考虑多个?

    (另外想要吃满资源好像还是应该用多进程? GIL ?)
    superalsrk
        4
    superalsrk  
       2020-03-09 18:40:48 +08:00
    guicorn
    superalsrk
        5
    superalsrk  
       2020-03-09 18:41:40 +08:00
    gunicorn -k gevent 试试这个?
    YUX
        6
    YUX  
    PRO
       2020-03-09 18:45:45 +08:00
    1. 你可以改用 aiohttp
    2. 可以看一下 meinheld
    asd648299819
        7
    asd648299819  
    OP
       2020-03-10 00:10:03 +08:00
    @misaka19000 本地多线程请求服务器,开了 50 个线程后服务器的返回已经比正常慢很多了,再加也没有意义了,然后再看服务器上的 flask 的 debug,每个请求的处理时间都是 0.3ms 左右
    asd648299819
        8
    asd648299819  
    OP
       2020-03-10 00:20:50 +08:00
    @tmackan
    1. 调 wsgi 配置是不是就是调整 gunicorn 的参数呀?
    2. 只是一个计算任务,看 celery 需要中间件,并不想那么麻烦,增加缓存也意味着要弄个数据库吧?因为我没学过数据库感觉这里又是一个大坑。
    3. 加配置我试过了,目前在 1h2g5m 上运行的效率和在 2h4g1m 上的效率一致,所以我认为是我的代码问题而不是机器性能问题。
    Eds1995
        9
    Eds1995  
       2020-03-10 11:11:10 +08:00
    用这个试试 gunicorn -w 3 -k gevent -b 0.0.0.0:2333 flask_test:app
    asd648299819
        10
    asd648299819  
    OP
       2020-03-10 17:32:38 +08:00
    @Eds1995
    使用了,发现在压测下计算成功率会降低很多,反而不如使用 gevent.pywsgi 中的 WSGIServer
    triangle111
        11
    triangle111  
       2020-03-11 17:58:19 +08:00
    不用 gevent 和 gunicorn,试试 app.run(threaded=True)?
    lithbitren
        12
    lithbitren  
       2020-04-02 02:13:41 +08:00
    app.run(processes=os.cpu_count())试试?
    hl0832
        13
    hl0832  
       2020-04-06 22:03:06 +08:00 via iPhone
    你这几乎都是计算过程( cpu 密集),多线程下 GIL 会使效果大打折扣~
    asd648299819
        14
    asd648299819  
    OP
       2020-04-08 21:39:25 +08:00
    @hl0832
    那该咋办呀?求指教
    RyougiShiki
        15
    RyougiShiki  
       2020-04-10 11:48:56 +08:00
    flask 内不要开多线程。gunicorn 起 2-4 个进程在不同端口(每一个 gunicorn 进程不必多线程多 worker), 前面 nginx 负载均衡。
    asd648299819
        16
    asd648299819  
    OP
       2020-04-12 22:28:21 +08:00
    @RyougiShiki
    谢谢指点,这是利用多机器来满足计算需求吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5969 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 750ms UTC 01:41 PVG 09:41 LAX 18:41 JFK 21:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86