在开发部署在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)?。
答案 0 :(得分:10)
Python会在线程模式下使用所有处理器吗?否。
Python不会使用所有可用的处理器;这种Python行为是否正常?是的,由于GIL,这是正常的。
有关讨论,请参阅http://mail.python.org/pipermail/python-3000/2007-May/007414.html。
您可能会发现,如果存在某些阻塞,每个核心/进程拥有一对(或4个)线程仍然可以提高性能,例如,等待来自数据库的响应会导致该进程阻止其他连接。 / p>
答案 1 :(得分:4)
python会在线程模式下使用所有处理器吗?否
这是正常的吗?是的,这很正常。 Python不会找到你所有的核心。
“具有少量线程的1个进程是默认的mod_wsgi方法”。但这不是最佳的,甚至是不可取的。那只是一个默认值。不要读任何东西。
如果您想使用所有计算机资源,请让操作系统处理它。使用流程。
多处理和多线程之间的区别很难在很大程度上衡量。使用进程或线程几乎不重要。使用进程通常更简单,因为对此有一些简单的操作系统支持。
底线
使用多个进程,允许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进程。