为什么线程比子进程慢?什么时候我应该使用子进程代替线程,反之亦然

Yaj*_*shi 4 python multithreading subprocess

在我的应用程序中,我尝试了python线程和子进程模块来打开firefox,我注意到子进程比线程更快.这背后的原因是什么?

什么时候用它们代替对方?

Mac*_*cke 7

Python(或者说CPython,常用的基于c的实现)具有Global Intepreter Lock(又名GIL).

当多个线程访问同一内存时,某种锁定是同步内存访问所必需的,这就是进程内部发生的事情.进程之间不共享内存(除非您专门分配此类内存),因此不需要锁定.

锁的全局性阻止了多个线程在同一进程中运行python代码.运行多个进程时,GIL不会干扰.

因此,Python代码不能在线程上扩展,您需要进程.

现在,如果您的Python代码主要是调用C-API(NumPy/OpenGL/etc),那么由于GIL通常在本机代码执行时发布,所以会有缩放,所以使用Python来实现它是好的(实际上是个好主意)管理多个主要执行本机代码的线程.

(还有其他Python解释器实现可以跨线程扩展(比如Jython,IronPython等),但这些并不是主流......但是,在单线程场景中通常比CPython慢​​一点.)