1.同步与异步
同步和异步关注点在于消息通信机制(synchronous/asynchronous communication)。
A调用B,B通过A的信息去执行任务然后将结果返回给A。(A为调用方,B为被调用方)
同步:B返回时即带了结果给A。
异步:B立即返回,但是没有结果给A,而是等B执行结果出来后主动通知A。
同步意味着严格的有序,异步意味着无序。
2.阻塞与非阻塞
阻塞与非阻塞关注点在于程序等待调用结果的状态 (侧重于调用方的行为)。
阻塞:程序被挂起的状态,它再等待某个操作完成期间,自身无法继续处理其他事务,则该程序在该操作上是阻塞的。(平时见得最多的就是网络IO阻塞及硬盘读取IO阻塞)
非阻塞:程序在等待某个操作完成期间,可以继续处理其他事务,则该程序在该操作上是非阻塞的。
仍然是用A调用B为例:
阻塞意味着A要等待B返回结果给它才能干活,B没返回结果之前,A不能处理其他事务。
非阻塞意味着B的结果还没出来时,A可以处理其他事务。
同步异步与阻塞非阻塞结合的例子(场景:小黄在等女友化完妆出门逛街)
同步阻塞:小黄站门口干等,看到女友化完妆后,就出发。
同步非阻塞:小黄站门口刷微博,时不时抬头看下女友是否化完妆,如果化完妆就出发。
异步阻塞:小黄站门口干等,女友化完妆会通知他,然后出发。
异步非阻塞:小黄站门口低头刷微博,女友化完妆通知他,然后出发。
3.并行与并发(concurrency/parallelism)
并行是逻辑上的同时进行,并发是物理上的同时进行(实时的)。
并发:
CPU执行是按照时间被切片的,每个片段处理的可以是不同的任务,而CPU不断切换任务导致宏观上任务是“同时”在执行。
并发强调程序的组织结构。指程序要被设计成多个可独立执行的子任务。
并发是为了让每个字任务都有机会被尽快执行,不一定提高整体进度。
并行:
多核CPU的情况下,每个CPU执行各自独立的子任务。是真正的同时执行。
并行描述的是程序的执行状态。指多个任务同时被执行。
并行是为了利用多核加速多任务完成的进度
python由于GIL的存在,一个进程中真正在运行的只能是一个线程。
所以python的多线程实际上利用的是并发,通过线程的切换实现IO操作的非阻塞。
一个进程内的多个线程只能使用一个CPU。