python多线程

大家可能听说过python多线程中存在的GIL问题,使得Python在处理计算密集型任务上效果反而不如单线程,为了更好的理解这一点,我们从CPU密集型任务和IO密集型任务入手,深入讨论一下python多线程及其相关知识。

CPU密集型和IO密集型

通常来说,我们把任务分为计算密集型(CPU)和IO密集型两种,从名字上可以判断出,计算密集型任务需要花费较大的CPU资源,比如进行大量的复杂数学计算,而python在处理这样的任务时往往会力不从心,因为任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。
而IO密集型任务则不一样,因为很少涉及到CPU计算,典型的是web应用,读写文件之类的任务。由于速度远远不如CPU和内存的处理速度,这类任务的大部分时间损耗都是在等待IO相关任务的完成,因此使用开发效率高的脚本语言相对更适合。

多线程与多进程

Python中比较常见的并发方式主要有两种:多线程和多进程。由于GIL的存在,python在处理多线程时往往只能交替执行的现象,所以说python不能有效的利用多核CPU,无法有效的处理CPU密集型任务。
而在处理IO密集型任务等待IO过程中会释放GIL, 最终会导致线程在等待IO过程中会被暂停去执行其他的线程,优化了阻塞等待IO的时间,优化了任务执行。

因为多线程GIL的存在,python在处理CPU密集型任务的时候往往会使用多进程,理由也很简单,每个进程GIL不同,因此不会出现多线程获取和释放GIL的尴尬。

你可能感兴趣的:(python多线程)