【发布时间】:2011-09-19 07:32:42
【问题描述】:
在我的应用程序中,我尝试了 python 线程和子进程模块来打开 Firefox,我注意到子进程比线程更快。这可能是什么原因?
什么时候可以互相代替使用?
【问题讨论】:
标签: python multithreading subprocess
在我的应用程序中,我尝试了 python 线程和子进程模块来打开 Firefox,我注意到子进程比线程更快。这可能是什么原因?
什么时候可以互相代替使用?
【问题讨论】:
标签: python multithreading subprocess
Python(或者更确切地说是 CPython,通常使用的基于 c 的实现)具有全局解释器锁(也称为 GIL)。
当多个线程访问同一内存时,需要某种锁定来同步内存访问,这就是进程内部发生的情况。进程之间不共享内存(除非您专门分配此类内存),因此那里不需要锁。
锁的全局性防止多个线程在同一个进程中运行 python 代码。运行多个进程时,GIL 不会干扰。
因此,Python 代码不能在线程上扩展,您需要为此使用进程。
现在,如果您的 Python 代码大部分都在调用 C-API(NumPy/OpenGL/等),那么由于 GIL 通常在本机代码执行时释放,所以会发生缩放,所以可以(实际上是个好主意)使用 Python 管理几个主要执行本机代码的线程。
(还有其他 Python 解释器实现可以跨线程进行扩展(如 Jython、IronPython 等),但这些还不是真正的主流......但通常比单线程中的 CPython 慢一些场景。)
【讨论】: