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

4

在我的应用程序中,我尝试使用Python的线程和子进程模块打开Firefox浏览器,我注意到子进程比线程更快。这背后的原因是什么?

何时可以在彼此之间使用它们?

1个回答

7
Python(或者更确切地说是常用的基于C语言实现的CPython)有一个全局解释器锁(GIL)。当多个线程访问同一块内存时,需要某种形式的锁来同步内存访问,这就是进程内发生的情况。除非你特别分配了这样的内存,否则内存不会在进程之间共享,因此在那里不需要锁。
锁的全局性质防止了多个线程在同一进程中运行Python代码。在运行多个进程时,GIL不会干扰。因此,Python代码不能在线程上进行扩展,你需要使用进程来实现。
如果你的Python代码大部分都在调用C-API(NumPy / OpenGL等),那么通常会有扩展,因为当本地代码执行时,GIL通常会被释放,因此使用Python管理大多数执行本地代码的线程是可以的(实际上是个好主意)。
(还有其他Python解释器实现可以跨线程扩展(例如Jython,IronPython等),但这些并不是主流...但在单线程场景下通常比CPython慢一点。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接