同步/异步--堵塞/非阻塞

同步/异步,堵塞/非阻塞的概念:

同步/异步:被调用者是否返回消息,只与被调用者有关

堵塞/非阻塞:程序在等待调用结果时的状态,只与调用者有关


概念与程序的对应:

同步:不返回消息,程序要么卡在那看着执行完(堵塞),要么向下执行,不过要时不时的回去看一下执行完了没(非堵塞)

异步:返回消息,程序当然也可以卡在那,等着接受返回的消息(堵塞),不过一般都是接着向下执行,之后只要接受消息就行(非堵塞)


程序的实现:

同步堵塞:等待return

同步非堵塞:并发,用多线程实现,主线程接着向下走,子线程去执行调用;

异步堵塞:没人干这种事,人家都说了做完会通知你的,你还傻傻的蹲在这等着

异步非堵塞:大家都这么干,这才是正常的好嘛


额外说一下同步非堵塞:

虽然感觉怪怪的,因为一般调用者的后续依赖这被调者的返回值,而多线程是不依赖的;如果依赖的话,只能用同步堵塞了,不依赖的话,同步非堵塞还行;

不过都是非堵塞,那么和异步非堵塞的区别在哪?

还是回到最初的概念上,异步非堵塞的本质是callback,即完成后通知,而多线程的话,完成了就完成了,不通知(非要通知谁也拦不住你)


再重点说下异步:

为什么要用异步,而放着多线程不用?

只是某些情况下异步好用,而非全部时间,这个情况就是处理阻塞的时候:

手动对堵塞进行异步操作,这样主程序对于cpu来讲一直是就绪的状态;

而如果是多线程,那么遇到堵塞,就会将主线程挂起,切换到以外一个任务


python中有三个模块用来实现异步:asyncio、aiohttp、twisted

还有两个关键字:async和await

原文地址:https://www.cnblogs.com/justaman/p/11479008.html