【问题标题】:Why thread is slower than subprocess ? when should I use subprocess in place of thread and vise versa为什么线程比子进程慢?我什么时候应该使用子进程代替线程,反之亦然
【发布时间】:2011-09-19 07:32:42
【问题描述】:

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

什么时候可以互相代替使用?

【问题讨论】:

    标签: python multithreading subprocess


    【解决方案1】:

    Python(或者更确切地说是 CPython,通常使用的基于 c 的实现)具有全局解释器锁(也称为 GIL)。

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

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

    因此,Python 代码不能在线程上扩展,您需要为此使用进程。

    现在,如果您的 Python 代码大部分都在调用 C-API(NumPy/OpenGL/等),那么由于 GIL 通常在本机代码执行时释放,所以会发生缩放,所以可以(实际上是个好主意)使用 Python 管理几个主要执行本机代码的线程。

    (还有其他 Python 解释器实现可以跨线程进行扩展(如 Jython、IronPython 等),但这些还不是真正的主流......但通常比单线程中的 CPython 慢一些场景。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-16
      • 2015-07-09
      • 1970-01-01
      • 2014-07-21
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多