文章目录

  • 1.进程与线程
  • 2.多进程与多线程
  • 2.1 什么是CPU密集型计算、IO密集型计算?
  • 2.2 多线程、多进程、多协程的对比
  • 2.3 怎样根据任务选择对应的技术?
  • 3.全局解释器锁GIL
  • 3.1 Python慢的两大原因
  • 3.2 GIL是什么
  • 3.3 为什么有GIL这个东西
  • 3.4 怎样规避GIL带来的限制


1.进程与线程

  • 进程是操作系统分配资源的最小单元, 线程是操作系统调度的最小单元。
  • 一个应用程序至少包括1个进程,而1个进程包括1个或多个线程,线程的尺度更小。
  • 每个进程在执行过程中拥有独立的内存单元,而一个线程的多个线程在执行过程中共享内存。

关于进程与线程阮一峰有一篇博客给出了比较形象的解释:进程与线程的一个简单解释

在Python对并发编程的支持如下:

  • 多线程:threading , 利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成
  • 多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务
  • 异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
  • 使用Lock对资源加锁,防止冲突访问
  • 使用Queue实现对不同线程/进程之间的数据通信,实现生产者-消费者模式
  • 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结果、获取结果
  • 使用subprocess启动外部程序的进程,并进行输入输出交互,实现交互式的进程通信

2.多进程与多线程

2.1 什么是CPU密集型计算、IO密集型计算?

CPU密集型(CPU-bound):也叫计算密集型,是指I/O在很短时间内可以完成‘,CPU需要大量的计算和处理,特点是CPU占用率相当高。例如:压缩解压缩、加密解密、正则表达式搜索

I/O密集型(I/O bound):指系统运作大部分的状况是CPU在等I/O(硬盘、内存)的读/写操作,CPU占用率较低。例如:文件处理程序、网络爬虫程序、读写数据库程序

2.2 多线程、多进程、多协程的对比

一个进程可以启动N个线程,一个线程可以启动N个协程

  • 多进程 Process(multiprocessing)

优点:可以利用多核CPU并行运算

缺点:占用资源最多,可启动数目比线程少

适用于:CPU密集型计算

  • 多线程Thread(threading)

优点:相比进程,更轻量级,占用资源少

缺点:(1)相比进程:多线程只能并发执行,不能利用多CPU(GIL)

(2)相比协程:启动数目有限,占用内存资源,有线程切换开销

适用于:IO密集型计算、同时运行的任务要求不多

  • 多协程Coroutine(asyncio)

优点:内存开销最少、启动协程数量最多

缺点:支持的库有限制(aiohttp vs requests)、代码实现复杂

适用于:IO密集型运算、需要超多任务运行、但有现成库支持

2.3 怎样根据任务选择对应的技术?

首先如果是CPU密集型,选择使用多进程mutiprocessing,其次如果是IO密集型要看以下条件:(1)需要超多任务量(2)有现成协程库支持(3)协程实现的复杂度可接受。如果以上三个条件满足则使用多协程,否则使用多线程。

3.全局解释器锁GIL

Python被吐槽慢的头号嫌疑犯

3.1 Python慢的两大原因

原因一:Python是动态类型语言,边解释边执行

原因二:GIL的存在,无法利用多核CPU并行执行

3.2 GIL是什么

全名:全局解释器锁(Global Interpreter Lock)

是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行

即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程

python 多进程与多线程 python的多线程和多进程_多线程

由于GIL的存在,即使电脑有多核CPU,单个时刻也只能使用一个,相比并发加速的C++/JAVA所以慢

3.3 为什么有GIL这个东西

简而言之:Python设计初期,为了规避并发带来的问题引入GIL,现在想去除却去不掉了。

为了解决多线程之间数据完整性和状态同步的问题

python 多进程与多线程 python的多线程和多进程_多进程_02

GIL的好处:简化了Python对共享资源的管理

3.4 怎样规避GIL带来的限制

1.多线程threading机制依然是有用的,用于IO密集型计算

因为在IO期间,线程会释放GIL,实现CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度

但是多线程应用于CPU密集型计算时,只会拖慢速度

2.使用multiprocessing的多进程机制实现并行计算,利用多核CPU优势

CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度

但是多线程应用于CPU密集型计算时,只会拖慢速度

参考资料:
https://zhuanlan.zhihu.com/p/46368084https://www.bilibili.com/video/BV1bK411A7tV?p=1