当你调用函数时,你在干什么,被调用函数在干什么?--同步与异步,阻塞与非阻塞
这里我试图区分并理解几个概念:
同步、异步、阻塞、非阻塞
基本
当我们在应用进程中调用一个系统函数后,我们希望系统函数返回结果
但是,生成结果是需要时间的,任何函数产生结果都需要时间,无非长短
于是,衍生出两个问题
1.调者如何知道函数已经产生结果?
2.在被调用函数产生结果的这段时间,调用者需要干什么?
对于第一个问题,我们有两种方式
调用者主动询问--同步
被调用者通知调用者--异步
所以,我们知道了
同步与异步是关于调用结果通知的描述
对于第二个问题,我们也有两种方式
调用者一直等着,别的啥也不干--阻塞
调用者干别的事情--非阻塞
所以,我们也知道了,阻塞与非阻塞是关于在被调用者返回结果这段时间内,调用者干不干别的事情的描述
组合
我们已经知道,同步异步、阻塞非阻塞是调用过程中关于两个问题的处理方式
那么,我们自然会得到他们的两两组合,我们挨个看
同步阻塞:调用者主动问询结果,在被调用者生成结果的这段时间内,调用者一直等待结果,其他啥也不做
同步非阻塞:调用者主动问询结果,在被调用者生成结果的这段时间内,调用者定时查询结果生成情况,其他时间则去做另外的事情
异步阻塞:被调用者通知调用者,在被调用者生成结果的这段时间内,调用者啥也不干
异步非阻塞:被调用者通知调用者,在被调用者生成结果的这段时间内,调用者干其他的
其中,异步阻塞这种方式
由于采用了异步通知的方式,因此在等待的时间内,调用者是可以做其他事情的,只是他自己不去做而已
这在实际使用中是不经济的,因此这种方式不会出现在实际使用中,这里列出来是为了讨论的完整性
进一步
我们已经看到了,消息异步通知的前提下,我们大多数情况下会选择非阻塞而不是阻塞
因为阻塞意味着进程挂起,无法响应后续请求
在同步通知前提下,为了实现非阻塞,调用者进程不得不定时询问,这需要消耗一定的cpu时间
有没有更好的方法来实现非阻塞?
异步通知的出现,使得非阻塞的实现更加方便和经济
调用者无需定时询问,可以甩开膀子干自己的事情,直到结果返回,再去处理结果
可以说,异步成就了非阻塞,或者说,为了实现非阻塞,人们发明了异步
(最后一句纯属脑洞)