python单进程能否利用多核cpu的测试结论

在很早的时候,就听网上的文章说:

python有GIL,所以在单进程内,即使使用多线程也无法利用到多核的优势,同一时刻,python的字节码只会运行在一个cpu上。

以前也是奉为真理,直到今天在对自己的python server做性能测试的时候,发现一个python进程的cpu居然达到了120%。

当用c++编程的时候,如果使用多线程,那么确实进程cpu超过100%非常正常,但是对python来说,似乎这样就和网上的文章冲突了。

所以还是决定自己亲身试验一下,编写代码如下:

 

运行环境为: centos6.4 64位, python 2.7.

得到的结果如下:

E588C2D7 1608 42CC B800 AD5338C87F47

可以清楚的看到,pid为31199的python进程cpu达到了787.9%,接近理论能达到的最大值 800%。

而上方的8个cpu也分别达到了近100%的利用率。

 

如果只是按照以上测试结果,确实可以得出的结论:python使用单进程,多线程确实能够使用到多核cpu,并不是网上传的结论。

但是,还是希望如果有读者对这块有更深入的研究能够进行批评指正,谢谢~


8月15日补充

感谢 la.onger 等几位博友的讨论,现在增加一个测试,用来测试纯cpu计算用一个线程or多个线程完成的总时间的差别,代码如下:

输入结果如下:

使用多线程后,比不用多线程还慢

为了与c++版做对比,也开发了c++代码如下:

输出结果如下:

可见,c++版确实性能提高了非常多。
由此可见,python的多线程编程,在多核cpu利用上确实差一些。

1 收藏 3 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
  • mah0gany   2016/01/25

    GIL锁是对于解释器的,它保证一个进程同一时刻只存在一个解释器实例,并不是说Python 不能利用多核,而是不能“有效”利用多核。一个进程的多个线程运行在多核上的时候,解释器仍有可能被某一线程阻塞导致其它线程的代码无法执行。移除GIL锁是没有必要的,会给多线程编程造成巨大的心智负担。要想充分利用多核,可以使用多进程+协程的方式,多进程下不存在GIL锁的问题,而协程的系统开销远比线程小所以理论上来说性能更优,协程可以轻松的达到十万甚至百万并发的级别,而子线程到达这个量级的时候调度开销会比较大。从Python3加入的新特性asyncio可以知道,python官方也认为与其解决GIL锁对多线程编程造成的困扰,不如转而鼓励使用语言级别的协程。虽然具体实现上有差别,然而Golang,Javascript也是采用类似的方式解决异步的问题的。

    • mah0gany   2016/01/25

      更正一下。。移出GIL锁对语言的使用者来说其实没有差别,新语言现在已经可以很好的避开GIL锁了,但是像Python这样的老牌语言,移出GIL锁可能会导致之前很多库出现兼容性问题。

    • mah0gany   2016/01/25

      如果要移除GIL锁,那只能换比解释器锁更细粒度的锁来保证多线程的安全性,这样就丧失了“解释器总是线程安全的”这一假定,这样会使得单线程效率会比使用GIL锁时更慢。

跳到底部
返回顶部