同步异步,阻塞非阻塞,并行并发

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。

参考链接:https://www.jianshu.com/p/5c80a19d0cc6

你可能感兴趣的:(同步异步,阻塞非阻塞,并行并发)