GIL介绍
在python中GIL的限制导致不论是在单核还是多核条件下,同时刻都只能运行 一个线程, 这使得Python多线程无法发挥多核并行的优势。
GIL全称为Global Interpreter Lock意思是全局解释器锁,其设计之初是出于对数据安全的考虑。在Python多线程下,每个线程的执行方式分如下三步。
-
获取GIL。
-
执行对应线程的代码。
-
释放GIL。
可见,某个线程要想执行,必须先拿到GIL。我们可以把GIL看作通行证,并且在一个Pyhon进程中,GIL只有一个。线程要是拿不到通行证,就不允许执行。这样会导致即使在多核条件下,一个Python进程中的多个线程在同一时刻也只能执行一个。
而对于多进程来说,每个进程都有属于自己的GIL,所以在多核处理器下,多进程的运行是不会受GIL影响的。也就是说,多进程能够更好地发挥多核优势。
不过,对于爬虫这种I0密集型任务来说,多线程和多进程产生的影响差别并不大。但对于计算密集型任务来说,由于GIL的存在,Python多线程的整体运行效率在多核情况下可能反而比单核更低。而Python的多进程相比多线程,运行效率在多核情况下比单核会有成倍提升。
多线程适场景:
- 大量的IO操作,如网络通信,文件读写等等。
- 并发处理请求和响应的Web应用程序。
- 处理数据流和流媒体。
多进程适场景:
- 计算密集型任务,如图像处理、数据挖掘等等。
- 并发处理多个CPU密集型任务的应用程序。
- 需要执行高性能并发任务的大型企业应用程序。
从整体来看,Python 的多进程比多线程更有优势。所以,如果条件允许的话,尽量用多进程。值得注意的是,由于进程是系统进行资源分配和调度的一一个独立单位,所以各进程之间的数据是无法共享的,如多个进程无法共享一个全局变量 ,进程之间的数据共享需要由单独的机制来实现。