并发(concurrency):并发的关键在于有处理多个任务的能力,但并不必定就是同时处理.java
例1: 吃饭时,电话响起,暂时停下吃饭的动做,接完电话后继续吃饭.多线程
例2: 一我的吃3个馒头并发
并行(parallelism):并行的关键在于同时处理多个任务app
例子1: 吃饭时,电话响起,同时进行吃饭和电话2个动做异步
例子2: 三我的吃3个馒头async
即便不看详细解释,也请记住这句话.函数
这个概念很好理解。所谓并行,就是同时执行的意思,无需过分解读。判断程序是否处于并行的状态,就看同一时刻是否有超过一个“工做单位”在运行就行了。因此,单线程永远没法达到并行状态。线程
要达到并行状态,最简单的就是利用多线程
和多进程
。设计
注意: Python 的多线程因为存在著名的 GIL(通俗理解为就是一把全局排他锁
),没法让两个线程真正“同时运行”,因此其实是没法到达并行状态的。3d
要理解“并发”这个概念,必须得清楚,并发指的是程序的“结构”。当咱们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。好,既然并发指的是人为设计的结构,那么怎样的程序结构才叫作支持并发的设计?
正确的并发设计的标准是:两个任务能够在重叠的时间段内启动、运行和完成(two tasks can start, run, and complete in overlapping time periods)。
是不是同时处理多个任务
同步和异步关注的是消息通讯机制 (synchronous communication/ asynchronous communication)
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
“阻塞”与"非阻塞" 与 "同步"与“异步"不能简单的从字面理解
前者关注的是等待结果时的状态,后者关注的是通讯机制
关注公众号:java宝典