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

2021-07-07 15:53:55 +08:00
 longmeier90
我们公司的项目是用 django+supervisor+gunicorn 配的, 
启着几个 workers 监听着: 
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'sync'
但是现在我们的一些统计报表导出会导致我们的服务器 cpu 报警、mysql 服务器 cpu 也会经常报警。

这种情况下是
1.升级一下 cpu 配置从目前的 4 核升级到 8 核,
2.还是买一个同样配置的服务器重新部署一套,来个负载均衡。
哪一个更好,想着是那种一劳永逸的解决。
我目前更倾向于后者总感觉 python 线程没有真正把多核 cpu 的资源利用起来。

各位大佬给个建议

2536 次点击
所在节点    Python
9 条回复
julyclyde
2021-07-07 16:30:34 +08:00
gunicorn 也可以选 worker 类型的啊
如果是线程,应该是不会充分利用 cpu 的
deplives
2021-07-07 16:31:51 +08:00
你不知道 python 的多线程是在一个核心上跑的么?
comphilip
2021-07-07 16:32:36 +08:00
CPython 不会,应该有 Global Interpreter Lock( https://realpython.com/python-gil/)。对于衍生品如 pypy,则可以。对于 CPython,多核的利用是利用子进程。
houzhiqiang
2021-07-07 18:12:49 +08:00
python(cpython) 多进程会利用多核,多线程不行,默认的 pypy 也一样,好像 pypy 有个 no gil 的实验版
jones2000
2021-07-07 19:23:11 +08:00
直接 docker 上部署,不行就多部署几套。
streamrx
2021-07-08 03:25:11 +08:00
不会
hxysnail
2021-07-08 08:53:17 +08:00
由于 GIL 全局锁的存在,Python 线程是没有办法利用到多核 CPU 的处理能力的。如果你的应用是计算密集型,需要充分利用多核处理器,建议开多进程。这里有篇文章可以参考一下: https://fasionchan.com/python-source/virtual-machine/gil/
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
2021-07-08 14:17:25 +08:00
8 楼+1

worker_class = 'sync'

分别是多进程方式,楼上莫着急回答

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX