Python在线程模式下会使用所有处理器吗?
在开发一个部署在Apache mod_wsgi上的Django应用时,我发现如果使用多线程(Python线程;mod_wsgi进程=1,线程=8),Python并不会利用所有可用的处理器。而如果采用多进程的方法(mod_wsgi进程=8,线程=1),一切都很好,我可以充分利用我的机器。
所以问题来了:这种Python的表现正常吗?我对此有些怀疑,因为使用1个进程和几个线程是mod_wsgi的默认做法。
我的系统配置是:
2个Intel Xeon 5XXX系列处理器(8个核心(开启超线程后为16个)),运行在FreeBSD 7.2 AMD64和Python 2.6.4上。
感谢大家的回答。我们都发现这种行为是正常的,因为有一个叫做GIL的东西。这里有个很好的解释:http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/,或者可以看看StackOverflow上关于GIL的讨论:什么是全局解释器锁(GIL)?。
5 个回答
还有希望。全局解释器锁(GIL)只是你从python.org下载的C语言实现的Python中的一个特性。Jython和IronPython是另外两个Python的实现,它们没有GIL,所以使用它们可能会得到更好的多线程效果。
Python在使用线程模式时会用到所有处理器吗?不会。
这是正常现象吗?是的,这是正常的。Python并不会努力去利用你电脑上的所有核心。
“一个进程加几个线程是mod_wsgi的默认方式。”但这并不是最优的选择,甚至也不一定是理想的。这只是一个默认设置,不用太在意。
如果你想充分利用电脑的资源,就让操作系统来处理。使用进程。
多进程和多线程之间的区别大部分情况下很难衡量。使用进程还是线程其实差别不大。通常使用进程更简单,因为操作系统对进程的支持很基础。
总结
使用多个进程,这样可以让操作系统(和Apache)尽可能多地利用系统资源。
线程共享它们所属进程的一小部分输入输出资源,而网页服务主要依赖输入输出。进程有独立的输入输出资源,更容易让你的处理器达到最大负荷。
Python在多线程模式下会使用所有处理器吗?不会。
Python不会使用所有可用的处理器;这是正常现象吗?是的,这是正常的,因为有个叫做GIL的东西。
想了解更多讨论,可以查看这个链接:http://mail.python.org/pipermail/python-3000/2007-May/007414.html。
你可能会发现,如果每个核心/进程有几个(或者4个)线程,性能还是会有所提升,尤其是在有阻塞的情况下,比如等待数据库的响应,这样会导致这个进程阻塞其他连接。