Python 起多个线程会充分用到多核 cpu 的资源吗 - 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
longmeier90
V2EX    Python

Python 起多个线程会充分用到多核 cpu 的资源吗

  •  
  •   longmeier90 2021-07-07 15:53:55 +08:00 3045 次点击
    这是一个创建于 1610 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们公司的项目是用 django+supervisor+gunicorn 配的, 启着几个 workers 监听着: workers = multiprocessing.cpu_count() * 2 + 1 worker_class = 'sync' 但是现在我们的一些统计报表导出会导致我们的服务器 cpu 报警、mysql 服务器 cpu 也会经常报警。 这种情况下是 1.升级一下 cpu 配置从目前的 4 核升级到 8 核, 2.还是买一个同样配置的服务器重新部署一套,来个负载均衡。 哪一个更好,想着是那种一劳永逸的解决。 我目前更倾向于后者总感觉 python 线程没有真正把多核 cpu 的资源利用起来。 

    各位大佬给个建议

    9 条回复    2021-07-08 14:17:25 +08:00
    julyclyde
        1
    julyclyde  
       2021-07-07 16:30:34 +08:00
    gunicorn 也可以选 worker 类型的啊
    如果是线程,应该是不会充分利用 cpu 的
    deplives
        2
    deplives  
       2021-07-07 16:31:51 +08:00
    你不知道 python 的多线程是在一个核心上跑的么?
    comphilip
        3
    comphilip  
       2021-07-07 16:32:36 +08:00
    CPython 不会,应该有 Global Interpreter Lock( https://realpython.com/python-gil/)。对于衍生品如 pypy,则可以。对于 CPython,多核的利用是利用子进程。
        4
    houzhiqiang  
       2021-07-07 18:12:49 +08:00
    python(cpython) 多进程会利用多核,多线程不行,默认的 pypy 也一样,好像 pypy 有个 no gil 的实验版
    jones2000
        5
    jones2000  
       2021-07-07 19:23:11 +08:00
    直接 docker 上部署,不行就多部署几套。
    streamrx
        6
    streamrx  
       2021-07-08 03:25:11 +08:00 via iPhone
    不会
    hxysnail
        7
    hxysnail  
       2021-07-08 08:53:17 +08:00
    由于 GIL 全局锁的存在,Python 线程是没有办法利用到多核 CPU 的处理能力的。如果你的应用是计算密集型,需要充分利用多核处理器,建议开多进程。这里有篇文章可以参考一下: https://fasionchan.com/python-source/virtual-machine/gil/
    dayeye2006199
        8
    dayeye2006199  
       2021-07-08 09:20:05 +08:00
    你这代码是多进程而非多线程。
    CPU 报警得分析分析原因:
    1. 是否是因为单个 worker 的 CPU 占用率过高?单个 worker 内部的任务代码是怎么样的?有些代码是可以释放 GIL 的,例如 numpy 的向量化,一个 process 也可以利用多核 CPU
    2. 是否是因为 job 太多导致整体负载高?
    3. 负载是一直很高还是瞬时有大量任务进来导致短时负载?
    4. 其他原因等等

    1 的话,如果单个 worker 就能跑满 CPU,建议减少 worker 的数量,同时 scale up,换用更强的 CPU
    2 的话,scale out,堆更多的机器
    3 的话,建议考虑使用 MQ 来异步处理任务,避免瞬时负荷过大
    frostming
        9
    frostming  
       2021-07-08 14:17:25 +08:00
    8 楼+1

    worker_class = 'sync'

    分别是多进程方式,楼上莫着急回答
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1006 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:45 PVG 06:45 LAX 14:45 JFK 17:45
    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