Python在线程模式下会使用所有处理器吗?

6 投票
5 回答
4848 浏览
提问于 2025-04-15 19:06

在开发一个部署在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 个回答

3

还有希望。全局解释器锁(GIL)只是你从python.org下载的C语言实现的Python中的一个特性。Jython和IronPython是另外两个Python的实现,它们没有GIL,所以使用它们可能会得到更好的多线程效果。

4
  1. Python在使用线程模式时会用到所有处理器吗?不会。

  2. 这是正常现象吗?是的,这是正常的。Python并不会努力去利用你电脑上的所有核心。

  3. “一个进程加几个线程是mod_wsgi的默认方式。”但这并不是最优的选择,甚至也不一定是理想的。这只是一个默认设置,不用太在意。

如果你想充分利用电脑的资源,就让操作系统来处理。使用进程。

多进程和多线程之间的区别大部分情况下很难衡量。使用进程还是线程其实差别不大。通常使用进程更简单,因为操作系统对进程的支持很基础。

总结

使用多个进程,这样可以让操作系统(和Apache)尽可能多地利用系统资源。

线程共享它们所属进程的一小部分输入输出资源,而网页服务主要依赖输入输出。进程有独立的输入输出资源,更容易让你的处理器达到最大负荷。

10

Python在多线程模式下会使用所有处理器吗?不会。

Python不会使用所有可用的处理器;这是正常现象吗?是的,这是正常的,因为有个叫做GIL的东西。

想了解更多讨论,可以查看这个链接:http://mail.python.org/pipermail/python-3000/2007-May/007414.html

你可能会发现,如果每个核心/进程有几个(或者4个)线程,性能还是会有所提升,尤其是在有阻塞的情况下,比如等待数据库的响应,这样会导致这个进程阻塞其他连接。

撰写回答