6

在开发部署在 Apache mod_wsgi 上的 Django 应用程序时,我发现在多线程(Python 线程;mod_wsgi 进程=1 线程=8)的情况下,Python 不会使用所有可用的处理器。使用多处理方法(mod_wsgi processes=8 threads=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讨论:什么是全局解释器锁(GIL)?.

4

5 回答 5

10

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

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

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

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

于 2010-02-10T11:24:47.617 回答
4
  1. python会在线程模式下使用所有处理器吗?不。

  2. 这正常吗?是的,这很正常。Python 不努力定位您的所有内核。

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

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

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

底线

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

线程为其所属的进程共享一组有限的 I/O 资源,并且网页服务受 I/O 限制。进程具有独立的 I/O 资源,并且更容易最大化您的处理器。

于 2010-02-10T11:25:35.397 回答
3

仍有希望。GIL 只是您从 python.org 下载的 C Python 实现的一个实现工件。Jython 和 IronPython 是 Python 的另外两个实现,它们没有 GIL,因此使用其中一个可能会有更好的线程结果。

于 2010-02-10T12:53:38.560 回答
1

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

看来您正在查看此锁定的结果,因此,就个人而言,我会在单个线程中使用多个进程。

于 2010-02-10T11:25:09.703 回答
1

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

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

于 2010-02-10T11:26:49.750 回答