Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么线程比子进程慢?什么时候我应该使用子进程代替线程,反之亦然_Python_Multithreading_Subprocess - Fatal编程技术网

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

Python 为什么线程比子进程慢?什么时候我应该使用子进程代替线程,反之亦然,python,multithreading,subprocess,Python,Multithreading,Subprocess,在我的应用程序中,我尝试了python线程和子进程模块来打开firefox,我注意到子进程比线程更快。这背后的原因可能是什么 何时使用它们来代替彼此?Python(或者更确切地说,是一种常用的基于c的实现)有一个全局Intepreter锁(也称GIL) 当多个线程访问同一内存时,需要某种类型的锁定来同步内存访问,这是进程内部发生的事情。进程之间不共享内存(除非您专门分配这样的内存),因此不需要锁 锁的全局性防止多个线程在同一进程中运行python代码。当运行多个进程时,GIL不会干扰 因此,Py

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

何时使用它们来代替彼此?

Python(或者更确切地说,是一种常用的基于c的实现)有一个全局Intepreter锁(也称GIL)

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

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

因此,Python代码不会在线程上进行扩展,您需要相应的进程

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

(还有其他的Python解释器实现可以跨线程扩展(如Jython、IronPython等),但它们并不是真正的主流,而且在单线程场景中通常比CPython慢一点。)