协程
主要概念点
同步
学术解释:
- 不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行的。
- 例如购物系统中更新商品库存,需要用“行锁”作为通信信号,让不同的更新请求强制排队顺序执行,那更新库存的操作是同步的。
- 简言之,同步意味着有序。
我的理解:
- 程序或者函数或者模块等,反正一个执行任务的单元在执行过程中排队讲上头下发的任务一个接一个的完成
- 每次只能执行一个任务,比如午餐时我们先去饭堂打饭,再去小卖部买瓶饮料,再去花园找个空位坐下吃饭,每次只能做一件事,如果人多还要排队(阻塞)。
异步
学术解释:
- 为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式。
- 不相关的程序单元之间可以是异步的。
- 例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。
- 简言之,异步意味着无序。
我的理解:
- 以午饭为例,从离开办公座位开始就打开手机通过饭堂微信下单点餐,通过商店微信下单饮料,同时通过公园微信做了一个线上排队,然后我去到饭堂不再需要排队点餐拿餐(非阻塞),我只要道前台拿打包好的餐。商店饮料也是,马不停蹄的直接走到公园刚好网上排队到我有空桌子,直接坐下开吃。
阻塞
阻塞是无处不在的,包括CPU切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。
(如果是多核CPU则正在执行上下文切换操作的核不可被利用。)
学术解释:
- 程序未得到所需计算资源时被挂起的状态。
- 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。
- 常见的阻塞形式有:网络I/O阻塞、磁盘I/O阻塞、用户输入阻塞等。
我的理解:
- 任何需要排队等待结果,途中闲着的时候,就是阻塞。
非阻塞
非阻塞的存在是因为阻塞存在,正因为某个操作阻塞导致的耗时与效率低下,我们才要把它变成非阻塞的。
学术解释:
- 程序在等待某操作过程中,自身不被阻塞,可以继续运行干别的事情,则称该程序在该操作上是非阻塞的。
- 非阻塞并不是在任何程序级别、任何情况下都可以存在的。
- 仅当程序封装的级别可以囊括独立的子程序单元时,它才可能存在非阻塞状态。
我的理解:
- 线上排队,每到我的时候我可以先驱做别的事情。
并发
- 并发描述的是程序的组织结构。指程序要被设计成多个可独立执行的子任务。
- 以利用有限的计算机资源使多个任务可以被实时或近实时执行为目的。
并行
- 并行描述的是程序的执行状态。指多个任务同时被执行。
- 以利用富余计算资源(多核CPU)加速完成多个任务为目的。
相关模块
asyncio
从2013年起由 Python 之父 Guido 亲自操刀主持了Tulip(asyncio)项目的开发。
总结
- 并行是为了利用多核加速多任务完成的进度
- 并发是为了让独立的子任务都有机会被尽快执行,但不一定能加速整体进度
- 非阻塞是为了提高程序整体执行效率
- 异步是高效地组织非阻塞任务的方式