同步/异步--堵塞/非阻塞
同步/异步,堵塞/非阻塞的概念:
同步/异步:被调用者是否返回消息,只与被调用者有关
堵塞/非阻塞:程序在等待调用结果时的状态,只与调用者有关
概念与程序的对应:
同步:不返回消息,程序要么卡在那看着执行完(堵塞),要么向下执行,不过要时不时的回去看一下执行完了没(非堵塞)
异步:返回消息,程序当然也可以卡在那,等着接受返回的消息(堵塞),不过一般都是接着向下执行,之后只要接受消息就行(非堵塞)
程序的实现:
同步堵塞:等待return
同步非堵塞:并发,用多线程实现,主线程接着向下走,子线程去执行调用;
异步堵塞:没人干这种事,人家都说了做完会通知你的,你还傻傻的蹲在这等着
异步非堵塞:大家都这么干,这才是正常的好嘛
额外说一下同步非堵塞:
虽然感觉怪怪的,因为一般调用者的后续依赖这被调者的返回值,而多线程是不依赖的;如果依赖的话,只能用同步堵塞了,不依赖的话,同步非堵塞还行;
不过都是非堵塞,那么和异步非堵塞的区别在哪?
还是回到最初的概念上,异步非堵塞的本质是callback,即完成后通知,而多线程的话,完成了就完成了,不通知(非要通知谁也拦不住你)
再重点说下异步:
为什么要用异步,而放着多线程不用?
只是某些情况下异步好用,而非全部时间,这个情况就是处理阻塞的时候:
手动对堵塞进行异步操作,这样主程序对于cpu来讲一直是就绪的状态;
而如果是多线程,那么遇到堵塞,就会将主线程挂起,切换到以外一个任务
python中有三个模块用来实现异步:asyncio、aiohttp、twisted
还有两个关键字:async和await