1. 首先介绍同步和异步
1.1 同步
不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式来协调程序单元保持顺序一致,称这些程序单元是同步执行的。
例如电商系统中更新商品库存,需要用“行锁”作为通信信号,让不同的更新请求排队顺序执行,这样就保证了更新库存的操作是同步的。
同步更加强调:有序
1.2 异步
为了完成某个任务,不同程序单元之间执行过程中无需通过通信协调,也能完成任务的方式。
例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。
异步更加强调:无序
2. 其次介绍阻塞和非阻塞
2.1 阻塞
程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。
常见的阻塞形式有:网络I/O阻塞、磁盘I/O阻塞、用户输入阻塞等。
阻塞是无处不在的,包括CPU切换上下文时,所有的进程都会被阻塞。(如果是多核CPU则正在执行上下文切换操作的核不可被利用)
2.2 非阻塞
程序在等待某操作的过程中,自身不被阻塞,可以继续运行干别的事情,则称该程序在该操作上是非阻塞的。
非阻塞的存在是因为阻塞存在,正因为某个操作阻塞导致的耗时与效率低下,我们才要把它变成非阻塞的。
3. 最后介绍并发和并行
3.1 并发
以利用有限的计算机资源使多个任务可以被实时或近实时的执行或计算。
并发更加强调程序的组织结构,比如在golang中,你go出去一个goroutine,对于程序来说就是一个并发。go出去多个goroutine就是多个并发。
3.2 并行
以利用多核CPU的优势加速完成多个任务或计算。
并发提供了一种程序组织结构方式,让问题的解决方案可以并行执行,但并行执行不是必须的。
那异步编程到底是什么,它和同步编程有哪些区别
以进程、线程、协程、函数/方法作为执行任务程序的基本单位,结合回调、事件循环、信号量等机制,以提高程序整体执行效率和并发能力的编程方式。如果在某程序的运行时,能根据已经执行的指令准确判断它接下来要进行哪个具体操作,那它是同步程序,反之则为异步程序。(无序与有序的区别)
同步/异步、阻塞/非阻塞并非水火不容,要看讨论的程序所处的封装级别。例如购物程序在处理多个用户的浏览请求可以是异步的,而更新库存时必须是同步的。
4. 小结
这篇文章大致讲解了一些基础概念,这些概念大家可能都比较熟悉,所以下篇文章我们重点讲解:异步编程的核心:epoll+Callback+Event loop。