我有一个服务器10个的CPU内核,当我跑下面的代码,其中一个线程时,CPU核心用法之一为100%:蟒多个线程性能
def fun():
while 1:
pass
但是当我使用5个线程运行相同的代码,有5个CPU核心使用率分别为:30%,20%,15%,25%,12%。
为什么不是5个CPU使用率分别为100%?如果多个python线程不能完全使用CPU,多线程应该如何比一个线程更快?
我有一个服务器10个的CPU内核,当我跑下面的代码,其中一个线程时,CPU核心用法之一为100%:蟒多个线程性能
def fun():
while 1:
pass
但是当我使用5个线程运行相同的代码,有5个CPU核心使用率分别为:30%,20%,15%,25%,12%。
为什么不是5个CPU使用率分别为100%?如果多个python线程不能完全使用CPU,多线程应该如何比一个线程更快?
你所描述的是典型的瓶颈,当更多的内核试图访问单个锁时,它会变得更加现实。正如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
模块可以帮助你。
“避免**的一种解决方案”?可能你的意思是“一种可能的解决方案”。 –
我编辑了答案,我相信@AndreaCorbellini是正确的。 –
那些历史原因是,现在仍然是非常实用*和*有效*。让GIL使垃圾收集代码变得简单很多(它不是线程安全的,但必须没有GIL)。删除GIL的愿望已经出现了好几次,但没有人管理它,[出于以下原因](https://wiki.python.org/moin/GlobalInterpreterLock)。 –
这可能是因为[Global Interpreter Lock](https://wiki.python.org/moin/GlobalInterpreterLock)。根据你的问题,你可以通过'multiprocessing'来解决它。 – mgilson