关于同步/异步,阻塞/非阻塞的区别

这个问题一直没太懂。被问到select,poll,epoll究竟是阻塞仍是非阻塞问题
本身的理解:A调用B,可能B操做会当即返回,或者半天才能返回结果。
所谓同步/异步,都是针对被调用者来讲。若是被调用者被调用后,直到有结果后才返回,那么就是同步。若是无论有没有结果都当即返回,就是异步。
阻塞和非阻塞,A调用B以后,A一直等着B返回结果,这个就是阻塞。若是A调用B以后,就去作其余事情,这个是非阻塞。javascript

# 好比swoole这种写法就是异步的,若是有message消息到来,调用函数
$serv->on('Message', function($server, $frame) {
    echo "message: ".$frame->data;
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

下面所有是查看的资料,若是有错误,很是欢迎你们可以直接指出。
参考资料:
https://www.zhihu.com/questio...
做者:严肃
连接:https://www.zhihu.com/questio...
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。java

“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通讯机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有获得结果以前,该调用就不返回。可是一旦调用返回,就获得返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出以后,这个调用就直接返回了,因此没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会马上获得结果。而是在调用发出后,被调用者经过状态、通知来通知调用者,或经过回调函数处理这个调用。典型的异步编程模型好比Node.js举个通俗的例子:你打电话问书店老板有没有《分布式系统》这本书,若是是同步通讯机制,书店老板会说,你稍等,”我查一下",而后开始查啊查,等查好了(多是5秒,也多是一天)告诉你结果(返回结果)。而异步通讯机制,书店老板直接告诉你我查一下啊,查好了打电话给你,而后直接挂电话了(不返回结果)。而后查好了,他会主动打电话给你。在这里老板经过“回电”这种方式来回调。2. 阻塞与非阻塞阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回以前,当前线程会被挂起。调用线程只有在获得结果以后才会返回。非阻塞调用指在不能马上获得结果以前,该调用不会阻塞当前线程。仍是上面的例子,你打电话问书店老板有没有《分布式系统》这本书,你若是是阻塞式调用,你会一直把本身“挂起”,直到获得这本书有没有的结果,若是是非阻塞式调用,你无论老板有没有告诉你,你本身先一边去玩了, 固然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板经过什么方式回答你结果无关。若是是关心blocking IO/ asynchronous IO, 参考 Unix Network Programming View Book编程


老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张以为本身有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张仍是以为本身有点傻,因而变高端了,买了把会响笛的那种水壶。水开以后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张以为这样傻等意义不大4 老张把响水壶放到火上,去客厅看电视,水壶响以前再也不去看它了,响了再去拿壶。(异步非阻塞)老张以为本身聪明了。所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶能够在本身完工以后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询本身(状况2中),形成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看电视的老张,非阻塞。状况1和状况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。因此通常异步是配合非阻塞使用的,这样才能发挥异步的效用。——来源网络,做者不明。json

做者:愚抄
连接:https://www.zhihu.com/questio...
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。swoole


做者:灵剑
连接:https://www.zhihu.com/questio...
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。网络

仍是不一样层次的问题……一个网络包从应用程序A发到另外一台电脑上的应用程序B,须要经历:从A的业务代码到A的软件框架从A的软件框架到计算机的操做系统内核从A所在计算机的内核到网卡从网卡通过网线发到交换机等设备,层层转发,到达B所在计算机的网卡从B所在计算机的网卡到B所在计算机的内核从B所在计算机的内核到B的程序的用户空间从B的软件框架到B的业务代码这个层级关系就像是过程调用同样,前一级调用后一级的功能,后一级返回一个结果给前一级(好比:成功,或者失败)。只有在单独一级的调用上,能够说同步仍是异步的问题。所谓同步,是指调用协议中结果在调用完成时返回,这样调用的过程当中参与双方都处于一个状态同步的过程。而异步,是指调用方发出请求就当即返回,请求甚至可能还没到达接收方,好比说放到了某个缓冲区中,等待对方取走或者第三方转交;而结果,则经过接收方主动推送,或调用方轮询来获得。从这个定义中,咱们看,首先1和7,这取决于软件框架的设计,若是软件框架能够beginXXX,而后当即返回,这就是一种异步调用,再好比javascript当中的异步HTTP调用,传入参数时提供一个回调函数,回调函数在完成时调用,再好比协程模型,调用接口后立刻切换到其余协程继续执行,在完成时由框架切换回到协程中,这都是典型的异步接口设计。而2和6,其余答主已经说得很好了,其实都须要调用方本身把数据在内核和用户空间里搬来搬去,其实都是同步接口,除非是IOCP这样的专门的异步传输接口,因此这一级实际上是同步的,阻塞与非阻塞的区别实际上是影响调用接口的结果(在特定条件下是否提早返回结果),而不是调用方式。3和5,内核通常经过缓冲区,使用DMI来传输数据,因此这一步又是异步的。4,以太网是个同步时序逻辑,随信号传输时钟,必须两边设备同时就绪了才能开始传输数据,这又是同步的。总结来讲,讨论到底是异步仍是同步,必定要严格说明说的是哪一部分。其余答主说非阻塞是同步而不是异步,这毫无疑问是正确的,然而说某个框架是异步IO的框架,这也是正确的,由于说的实际上是框架提供给业务代码的接口是异步的,不论是回调仍是协程,好比说咱们能够说某个库是异步的HTTPClient,并无什么问题,由于说的是给业务代码的接口。因为一般异步的框架都须要在2中使用非阻塞的接口,的确会有不少人把非阻塞和异步混为一谈。框架

相关文章
相关标签/搜索