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 · 2556 次点击
    这是一个创建于 1236 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们公司的项目是用 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,多核的利用是利用子进程。
    houzhiqiang
        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   ·   实用小工具   ·   2752 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:15 · PVG 16:15 · LAX 00:15 · JFK 03:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.