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

时间:2010-02-10 11:17:56

标签: python django multithreading performance multiprocessing

在开发部署在Apache mod_wsgi上的Django应用程序时,我发现在多线程(Python线程; mod_wsgi进程= 1个线程= 8)的情况下,Python将不会使用所有可用的处理器。使用多处理方法(mod_wsgi processes = 8个线程= 1)一切都很好,我可以完全加载我的机器。

所以问题是:这种Python行为是否正常?我对此表示怀疑,因为使用少数线程的1进程是默认的mod_wsgi方法。

系统是:

FreeBSD 7.2 AMD64和Python 2.6.4上的2xIntel Xeon 5XXX系列(8核(16个超线程))


谢谢大家的回答。 我们都发现这种行为是正常的,因为GIL。这是一个很好的解释: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ 或stackoverflow GIL讨论:What is a global interpreter lock (GIL)?

5 个答案:

答案 0 :(得分:10)

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

Python不会使用所有可用的处理器;这种Python行为是否正常?是的,由于GIL,这是正常的。

有关讨论,请参阅http://mail.python.org/pipermail/python-3000/2007-May/007414.html

您可能会发现,如果存在某些阻塞,每个核心/进程拥有一对(或4个)线程仍然可以提高性能,例如,等待来自数据库的响应会导致该进程阻止其他连接。 / p>

答案 1 :(得分:4)

  1. python会在线程模式下使用所有处理器吗?否

  2. 这是正常的吗?是的,这很正常。 Python不会找到你所有的核心。

  3. “具有少量线程的1个进程是默认的mod_wsgi方法”。但这不是最佳的,甚至是不可取的。那只是一个默认值。不要读任何东西。

  4. 如果您想使用所有计算机资源,请让操作系统处理它。使用流程。

    多处理和多线程之间的区别很难在很大程度上衡量。使用进程或线程几乎不重要。使用进程通常更简单,因为对此有一些简单的操作系统支持。

    底线

    使用多个进程,允许OS(和Apache)尽可能多地使用系统。

    线程为它们所属的进程共享一组有限的I / O资源,并且网页服务受I / O限制。进程具有独立的I / O资源,可以更轻松地最大化您的处理器。

答案 2 :(得分:3)

还有希望。 GIL只是您从python.org下载的C Python实现的实现工件。 Jython和IronPython是Python的另外两个实现,它们没有GIL,所以你可能有更好的线程结果。

答案 3 :(得分:1)

我不知道是否仍然如此,但Python解释器中存在全局锁定,即使使用多线程,也会阻止单个解释器使用所有处理器资源。 IIRC,全局锁定与I / O有关。

看来你正在看这个锁的结果,所以,就个人而言,我会用一个线程来使用多个进程。

答案 4 :(得分:1)

是。 Python并不是真正的多线程。相反,有一个全局锁,每个线程依次执行一些操作。这使得在Python中编写MT应用程序变得更加简单,因为过时的缓存等都不会出现任何问题。

因此,一个Python进程只能占用一个CPU。要充分利用多核系统,必须运行多个Python进程。