2015-09-06 59 views
2

我有一个服务器10个的CPU内核,当我跑下面的代码,其中一个线程时,CPU核心用法之一为100%:蟒多个线程性能

def fun(): 
    while 1: 
     pass 

但是当我使用5个线程运行相同的代码,有5个CPU核心使用率分别为:30%,20%,15%,25%,12%。

为什么不是5个CPU使用率分别为100%?如果多个python线程不能完全使用CPU,多线程应该如何比一个线程更快?

+2

这可能是因为[Global Interpreter Lock](https://wiki.python.org/moin/GlobalInterpreterLock)。根据你的问题,你可以通过'multiprocessing'来解决它。 – mgilson

回答

4

你所描述的是典型的瓶颈,当更多的内核试图访问单个锁时,它会变得更加现实。正如mgilson提到的,这是GIL的许多实现中存在的副作用。 Python中的GIL保证一次只有一个线程执行Python字节码。这是历史原因。但正如罗兰在评论中也提到的那样,GIL使得垃圾回收器的调试更容易。有像IronPython这样的实现,虽然没有GIL。

Python 2和Python 3有不同的方法如何线程获取GIL。

的Python 2:http://www.dabeaz.com/python/GIL.pdf

的Python 3:http://www.dabeaz.com/python/NewGIL.pdf

一种解决方案是独立产卵Python解释。他们作为独立的流程工作,可以做自己的工作。 multiprocessing模块可以帮助你。

+0

“避免**的一种解决方案”?可能你的意思是“一种可能的解决方案”。 –

+0

我编辑了答案,我相信@AndreaCorbellini是正确的。 –

+0

那些历史原因是,现在仍然是非常实用*和*有效*。让GIL使垃圾收集代码变得简单很多(它不是线程安全的,但必须没有GIL)。删除GIL的愿望已经出现了好几次,但没有人管理它,[出于以下原因](https://wiki.python.org/moin/GlobalInterpreterLock)。 –