python中的多线程技术

来源:互联网 发布:阿里云 服务器托管 编辑:程序博客网 时间:2024/06/15 20:17

最近在做项目的时候,使用了大量的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)

原创粉丝点击