并发和并行
并发和并行
并发指逻辑上同时处理多件事情,并行指实际上同时做多件事情。
并发不一定通过并行实现,也可以通过多任务实现。例如:现代操作系统都可以同时执行多个任务,比如同时听歌和玩游戏,但歌曲播放和游戏运行并不一定是同时发生的,可能第1个CPU时间播放歌曲,然后第2个CPU时间执行游戏,这样交替执行。而并行是要求同时执行,即同一个CPU时间两个事情都发生,为了实现并行,必须能同时执行多个计算任务,如多核CPU或多个CPU。
并发和并行不互斥,并行是并发的一种实现方式。
Python实现并发的方式:进程、线程、协程
进程是程序运行时的一个实例。进程通信只能携带原始字节,因此Python的对象需要序列化为原始字节才能在进程间通信。
线程是一个进程中的执行单元。一个进程启动后,会创建主线程,并且可以调用操作系统API创建更多线程。一个进程内的线程可以共享内存空间,轻松共享数据。
GIL全称为全局解释器锁,每个Python解释器程序是一个进程,虽然可以在一个进程中启动多个线程,但同一时间只有一个Python线程可以持有GIL,其它线程无法执行。所以Python中无法通过线程实现并行计算。
协程是可以挂起自身并在以后恢复的函数。Python 协程通常在事件循环(也在同一个线程中)的监督下在单个线程中运行。协程支持协作式多任务处理:一个协程必须使用 yield
或 await
关键字显式放弃控制权,另一个协程才可以并发(而非并行)开展工作。
参考:
- 《流畅的Python》(第二版)第19章 Python并发模型