我有一个服务器有10个cpu核心,当我运行以下代码时,一个线程,其中一个cpu核心使用率是100%:
def fun():
while 1:
pass
但是当我使用5个线程运行相同的代码时,有5个cpu核心用法分别为:30%,20%,15%,25%,12%。
为什么不是5个cpu核心分别拥有100%的用途?如果多个python线程无法完全使用CPU,多个线程应该如何比一个线程更快?
答案 0 :(得分:4)
您所描述的是典型的瓶颈,当更多核心尝试访问单个锁时,该瓶颈会变得更加明显。正如mgilson提到的,这是GIL的副作用,它存在于许多Python实现中。 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
模块可以为您提供帮助。