当你在调用函数时,你在干什么,被调用函数在干什么?--同步与异步,阻塞与非阻塞

Posted jiage666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当你在调用函数时,你在干什么,被调用函数在干什么?--同步与异步,阻塞与非阻塞相关的知识,希望对你有一定的参考价值。

这里我试图区分并理解几个概念:

同步、异步、阻塞、非阻塞

基本

当我们在应用进程中调用一个系统函数后,我们希望系统函数返回结果

但是,生成结果是需要时间的,任何函数产生结果都需要时间,无非长短

于是,衍生出两个问题

1.调者如何知道函数已经产生结果?

2.在被调用函数产生结果的这段时间,调用者需要干什么?

对于第一个问题,我们有两种方式

调用者主动询问--同步

被调用者通知调用者--异步

所以,我们知道了

同步与异步是关于调用结果通知的描述

对于第二个问题,我们也有两种方式

调用者一直等着,别的啥也不干--阻塞

调用者干别的事情--非阻塞

所以,我们也知道了,阻塞与非阻塞是关于在被调用者返回结果这段时间内,调用者干不干别的事情的描述

组合

我们已经知道,同步异步、阻塞非阻塞是调用过程中关于两个问题的处理方式

那么,我们自然会得到他们的两两组合,我们挨个看

同步阻塞:调用者主动问询结果,在被调用者生成结果的这段时间内,调用者一直等待结果,其他啥也不做

同步非阻塞:调用者主动问询结果,在被调用者生成结果的这段时间内,调用者定时查询结果生成情况,其他时间则去做另外的事情

异步阻塞:被调用者通知调用者,在被调用者生成结果的这段时间内,调用者啥也不干

异步非阻塞:被调用者通知调用者,在被调用者生成结果的这段时间内,调用者干其他的

其中,异步阻塞这种方式

由于采用了异步通知的方式,因此在等待的时间内,调用者是可以做其他事情的,只是他自己不去做而已

这在实际使用中是不经济的,因此这种方式不会出现在实际使用中,这里列出来是为了讨论的完整性

进一步

我们已经看到了,消息异步通知的前提下,我们大多数情况下会选择非阻塞而不是阻塞

因为阻塞意味着进程挂起,无法响应后续请求

在同步通知前提下,为了实现非阻塞,调用者进程不得不定时询问,这需要消耗一定的cpu时间

有没有更好的方法来实现非阻塞?

异步通知的出现,使得非阻塞的实现更加方便和经济

调用者无需定时询问,可以甩开膀子干自己的事情,直到结果返回,再去处理结果

可以说,异步成就了非阻塞,或者说,为了实现非阻塞,人们发明了异步

(最后一句纯属脑洞)

以上是关于当你在调用函数时,你在干什么,被调用函数在干什么?--同步与异步,阻塞与非阻塞的主要内容,如果未能解决你的问题,请参考以下文章

当使用带有immutable-js的redux时 - 你在选择器上调用了JS()吗?或者你在渲染函数中使用.get('prop')?

为啥python的函数没被调用就被执行了?

函数RAND啥意思

析构函数没调用

问个问题,为啥我定义的static函数能被其他源文件调用。

java怎么调用带参数构造函数