最近在做项目的时候,使用了大量的python多线程技术,结果发现效率不如想象的那么高。仔细研究了下,才发现是个人长久以来使用python多线程的一个误区:
具体问题如下:
sinCpuMain.py脚本使用threading的模块创建了N个多线程,cpurate.sh是一个监控cpu使用率的脚本。通过调试不同的参数N,得到如下的表:
|
线程数 |
使用率 |
消耗时间 |
|
1 |
6.27%~5.39% |
0:00:09.987037 |
|
2 |
7.74%~7.18% |
0:00:36.152315 |
|
4 |
9.09%~9.44% |
0:01:23.382693 |
|
8 |
8.82%~9.13% |
0:02:51.702328 |
|
16 |
9.01%~8.78% |
0:05:33.370549 |
从上面可以看到问题,线程数倍增,cpu使用率不增,消耗时间却倍增。这和想象的相距甚远,理论上来说,应该随着线程数的增加,cpu的使用率应该往上升,消耗时间应该没有明显变化。
为此特别去研究了下多线程技术,有两种:一种是单cpu的多线程技术,一种是多cpu的多线程技术。在多核的时代,显然是后者更有效率。
但很不幸,上面的事实告诉我们,python的多线程技术是前者,是伪多线程,主要是由于python的解释器的后台中存在一个全局锁,这导致只能有一个线程获取该锁进行执行。具体描述见链接:http://developer.51cto.com/art/201003/189708.htm
如果一定要充分利用cpu的资源的,也是有办法的,可以利用python的多进程技术。具体方法有很多,python中有multiprocessing,os,commands等模块,下面是我用multiprocessing模块的一个测试(mulCpuMain.py):
|
进程数 |
使用率 |
消耗时间 |
|
1 |
6.30%~ 6.29% |
0:00:10.354268 |
|
2 |
12.09%~ 12.21% |
0:00:09.726785 |
|
4 |
25.06%~ 25.16% |
0:00:09.742427 |
|
8 |
50.03%~ 50.23% |
0:00:10.102721 |
|
16 |
100.00%~ 100.00% |
0:00:20.012515 |
|
14 |
87.58%~ 81.03% |
0:00:17.945362 |
|
12 |
75.02%~ 63.07% |
0:00:15.038473 |
|
10 |
61.56%~ 62.53% |
0:00:14.640572 |
当cpu使用率小于或者接近50%的时候,进程数倍增,使用率也倍增,消耗时间却基本不变。
当cpu使用率大于50%的时候,进程数增加,使用率也增加,消耗时间也增加。
所以性价比最高的时候,应该是在50%左右的cpu利用率的时候。
测试环境为dw-dhw-dev,有物理cpu两个,虚拟cpu16个(命令cat /proc/cpuinfo | grep processor |wc -l)
本文探讨了Python中多线程技术的实际效果,并对比了多进程技术在提高CPU利用率和减少任务执行时间方面的表现。

被折叠的 条评论
为什么被折叠?



