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)
- python中的多线程技术
- C#中的多线程技术
- Qt中的多线程技术
- Qt中的多线程技术
- Qt中的多线程技术
- Qt中的多线程技术
- python中的多线程
- python中的多线程
- python中的多线程
- python多线程中的join()
- Python中的多线程MultiThread
- python中的多线程学习
- python中的多线程-threading
- python中的多线程爬虫
- Python中的多线程
- python中的多线程
- 在Ruby中的多线程技术
- python中的多线程-共享全局变量
- 英语邮件中常用的礼貌用语
- html组成的图片
- BIRT报表目录
- ABAP 写数据到SAP服务器文件
- 弹性方框模型 (FLEXIBLE BOX MODEL) 快速入门
- python中的多线程技术
- 回顾总结一下JDK高并发的包(集合、多线程、锁)
- Unity 模型的制作规范
- 详解手机版 Ubuntu:创新不少 前途不明
- selinux anrdroid 说明
- 在启动Activity时,如何隐藏输入法
- C#读写文件:编码和转换(string和byte[]转换为例)
- js 截取URL中的某个参数的值
- struts2面试题