精华内容
下载资源
问答
  • 同步、异步、阻塞及非阻塞是开发中经常遇到的概念,有区别又有联系,极其容易混淆。在深入理解这些概念的时候,需要借助现实中的例子来辅助。 概念解释 同步 在调用操作未完成前,调用者一直在等待这个结果,不...

    同步、异步、阻塞及非阻塞是开发中经常遇到的概念,有区别又有联系,极其容易混淆。在深入理解这些概念的时候,需要借助现实中的例子来辅助。

    概念解释

    同步

    在调用操作未完成前,调用者一直在等待这个结果,不得到结果不返回。

    异步

    在调用后,调用者直接返回,不主动获取和等待调用结果。而是被调用者通过通知或者回调函数来通知调用者。

    阻塞

    调用时,由于被调用者状态未就绪,导致调用线程被挂起。状态未就绪并不是指调用者运行缓慢,时间久。

    非阻塞

    调用时,被调用者如果就绪则立即返回结果,如果未就绪也会返回一个错误值,告诉调用者当前的状态。调用者可根据错误值选择再次调用,还是执行异常处理。

    区别

    在上面的表述中,很容易发现同步和阻塞,异步和非阻塞是一个概念(也可能我表达能力差。哈哈)。实际上,同步异步、阻塞非阻塞分别是不同维度的概念:

    • 同步异步侧重于描述调用者进行调用之后的行为(以io读写操作为例):

    同步在调用后,会主动去获取调用结果,无论是以阻塞方式还是非阻塞轮询方式,调用者需要自己去调用send和recv读写数据。所以像select,epoll等都是同步方式。
    异步在调用后,就继续执行其它的工作,读取数据的工作由内核去操作,当数据已经就绪并拷贝到用户空间后,通过通知或者回调函数的形式通知调用者进行数据处理。像mina就是典型的异步模式。
    由此可见,同步异步的区别在于同步需要调用者读写数据,而异步不需要读写数据.

    • 阻塞和非阻塞侧重于描述被调用者在执行时所处于的状态:

    阻塞操作是被调用者由于数据未准备好,如内核发送缓冲区满或者接收缓冲区空等原因,导致send和recv接口无法返回,此时操作系统将读写线程挂起,让出时间片。
    注意:读写操作慢,并不是上文所说的阻塞情况。
    非阻塞操作正好相反,当数据未准备好时,会立即返回给调用者一个结果,如-1,同时设置errno,调用者根据errno判断是否要重新读取数据。

    以下是网友举的例子:

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

    转载文章!!!
    作者:我叫小小强
    链接:https://www.jianshu.com/p/315275698250
    來源:简书

    展开全文
  • 简述js中的同步阻塞和异步非阻塞

    千次阅读 2019-05-24 11:14:00
    要想了解js中的同步阻塞和异步非阻塞,首先我们要对进程线程的基本概念有一个清楚 的了解。 进程:是并发执行的程序在执行过程中分配管理资源的基本单位,简单来说你的电脑每运行一个程序就是一个进程。 线程:...

    进程和线程

    要想了解js中的同步阻塞和异步非阻塞,首先我们要对进程和线程的基本概念有一个清楚 的了解。
    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,简单来说你的电脑每运行一个程序就是一个进程。
    线程:进程的一个执行单元,是操作系统能够进行运算调度的最小单位。
    一个程序至有一个进程,一个进程至少有一个线程。
    举个例子来说明一下

    比如你的电脑打开了迅雷,那么迅雷就是一个进程;你的电脑打开来QQ,那么QQ就是一个进程。你的电脑每打开一个程序就多了一条进程。
    拿QQ这个进程来说,你打开语音,那么语音就是QQ这个进程中的一个线程,你开启了视频,就是打开了QQ这个进程中视频的这个线程。

    同步和异步

    说完了进程和线程,现在再来聊一下同步和异步
    大家都知道js是单线程机制的,它分为两种工作模式,同步模式和异步模式。
    同步:就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。简单点来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
    异步:与异步相对,它在发出一个功能调用是,在没得到结果前,可以继续去进行后续操作,等调用完成后在通知调用者。通俗点讲就是这件事正在做,没做完,但是你可以去做下一件事,等这件事做完了,再通知你

    下面用一副图来描述一下

    阻塞和非阻塞

    阻塞和非阻塞,通常指的是针对IO的操作。
    阻塞:简单来说就是,我们调用了一个函数之后,在等待这个函数返回结果之前,如果当前的线程是处于挂起状态,那么就叫阻塞。
    非阻塞:与阻塞相反,如果执行一个函数后,当前线程仍处于运行状态,就意味当前线程是可以的继续处理其他任务,但要时不时的去看下是否有结果了,这就是非阻塞。

    同步阻塞和异步非阻塞

    阻塞和非阻塞针对于调用者,同步异步针对于被调用者,两两结合,共有四种状态,即

    • 同步阻塞
    • 同步非阻塞
    • 异步阻塞
    • 异步非阻塞
      接下来用一个例子来形容一下四者的区别,如图

    因为 js是单线程机制的,所有的操作都必须一个一个来,如果中间有一个操作非常耗时,那整个线程都会阻塞在那里,这就是 同步阻塞
    为了解决这个问题,js引入了事件和回调函数机制,对于一个IO操作,比如一个ajax,当发出一个异步请求后,程序不会阻塞在那里等待结果的返回,而是继续执行下面的代码。 当请求成功获取到结果后,就会调用回调函数来处理后面的事情,这个就是 异步非阻塞

    转载于:https://juejin.im/post/5ce7b37c5188253332621256

    展开全文
  • java同步非阻塞IO

    2021-02-26 14:46:00
    发布于 2018-07-02异步IO编程在...从另外一个角度看待的话,底层操作系统对于非阻塞IO的系统调用是一种多路复用机制,js对其进行了比较厚的封装,转换成了异步IO。但是,也可以进行一层稍微薄点的封装,保留这种多路...

    发布于 2018-07-02

    87306ba202ee259a622a4b5ada1d57f2.gif

    异步IO编程在javascript中得到了广泛的应用,之前也写过一篇博文进行梳理。

    js的异步IO即是异步的,也是非阻塞的。非阻塞的IO需要底层操作系统的支持,比如在linux上的epoll系统调用。

    从另外一个角度看待的话,底层操作系统对于非阻塞IO的系统调用是一种多路复用机制,js对其进行了比较厚的封装,转换成了异步IO。

    但是,也可以进行一层稍微薄点的封装,保留这种多路复用的模型,比如java的NIO,是一种同步非阻塞的IO模型。

    非阻塞IO的一大优势是,性能好,快啊!这在对IO性能要求高的场景得到了大量应用,比如SOA框架。

    传统的同步阻塞IO

    同步阻塞IO的特点

    传统的同步IO方式,比如网络传输,比如文件IO,在调用者调用read()时,调用会被一层一层调用下去直到OS的系统调用,调用者的线程会被阻塞。

    当读取完成时,该线程又会被唤醒,read()函数返回IO操作读取的数据。

    我们很容易能发现这种方式的特点及优劣:

    接口容易理解,编程难度低。对调用者而言,read()就像一个普通的函数调用一样,返回读取的数据。只不过可能这个操作有点慢,这个函数执行时间长了一些而已。

    在费时的IO操作时,线程需要等待IO完成。这意味着,如果你需要多个IO操作同时进行,就只能通过开多个线程来解决。

    在客户端编程时,第二点这个问题不大。客户端程序对IO的并发要求不高,反而因为同步阻塞IO的接口易于编程而能够减轻编程难度,代码更直观更可读,从而变相的提高可调试性和开发效率。

    服务端编程的特点

    然而,在服务器端编程的时候,这个劣势就很明显了,服务器端程序可能会面临大量并发IO的考验。

    传统的同步IO方式,比如说socket编程,服务器端的一个简单的处理逻辑是这样的:

    使用一个线程监听端口,如有客户端的TCP连接连入,就交由处理线程处理。

    每来一个TCP连接,就需要开一个线程来处理和该客户端的逻辑。

    在实际场景中会有很多优化技术,比如使用线程池。然而线程池仅仅是将TCP连接放入一个队列里交由线程池中空闲的线程处理。

    实质上,即使使用线程池,也改变不了正在被处理的每一个请求都需要占用一个单独的线程这一事实。

    这样,会造成一些问题:

    每一个请求需要一个线程来处理,但是服务器的线程数量是有上限的,这就限制了服务器的并发量。

    线程本身的调度也占用一定的操作系统资源,在线程比较多的情况下,这个占用叠加起来就非常客观。

    多路复用IO

    概念及模型

    java提供的NIO就是一种多路复用IO方式。

    它能够将多个IO操作用一个线程去管理,一个线程即可管理多个IO操作。

    NIO的操作逻辑是这样的,首先将需要监控的IO操作注册到某个地方,并由一个线程管理。

    当这些IO操作完成,会以事件的形式产生。该线程能够获取到完成的事件列表,并且对其进行处理。

    java的NIO中有三个重要的概念:

    Channel通道。表示一种IO原始源。如ServerSocketChannel表示监听客户端发起的TCP连接。

    通过Channel能够发起某种IO操作,但是却立即返回不阻塞。

    Buffer 缓冲区。Channel读取或写入的数据必须通过Buffer。网络读写常用的是ByteBuffer。

    Selector 选择器。NIO中最核心的东西,将Channel注册到Selector中,使得Selector能够监控到该IO操作。

    可以理解成Selecotr不断轮询被注册的Channel,一旦Channel中有注册的事件发生,便能处理发生的事件。

    这里只是做个总结,看下下面的示例代码就明白了。

    Selector和Channel

    private void exec(int port) throws IOException {

    Selector selector = Selector.open();

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

    serverSocketChannel.socket().bind(new InetSocketAddress(port));

    serverSocketChannel.configureBlocking(false);

    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

    while (true) {

    int n = selector.select(); // Block

    Iterator it = selector.selectedKeys().iterator();

    while (it.hasNext()) {

    SelectionKey key = it.next();

    if (key.isAcceptable()) {

    ServerSocketChannel server = (ServerSocketChannel) key.channel();

    SocketChannel channel = server.accept();

    if (channel != null) {

    channel.configureBlocking(false);

    channel.register(selector, SelectionKey.OP_READ);

    onAccept(channel);

    }

    }

    if (key.isReadable()) {

    SocketChannel socketChannel = (SocketChannel) key.channel();

    onRead(socketChannel);

    }

    it.remove();

    }

    }

    }

    来一步一步的分析这些代码。

    首先,第3行到第6行是对通道ServerSocketChannel的操作。

    对于这个ServerSocketChannel,首先是设定了它的监听地址,这个与传统的阻塞IO一致,给定一些初始的数据。传统的阻塞IO之后会调用socket.accept()来获取客户端连接的TCP连接,这是一个阻塞的方法。

    但是NIO在这里把ServerSocketChannel注册到了Selector上,并且监控OP_ACCEPT事件。这个时候socket可以认为已经在监听了,但是没有阻塞线程。

    之后,如果有TCP连接连接上,OP_ACCEPT事件就会产生,通过selector即可处理该事件。

    因此,NIO的操作逻辑其实是事件驱动的。

    后面的循环则是Selector处理的主逻辑。

    第9行,这是一个阻塞的方法。它会等待被注册的这些IO操作处理完成。一旦有一部分IO操作完成,它就会返回。

    通过selector.selectedKeys()即可获得完成的IO操作的事件。后面的代码也就是在处理这些事件。

    这部分完成的IO事件处理完毕后,就会循环的去处理下一批完成的IO事件,如此往复。

    这里,我们可以清晰的看到,通过NIO的多路复用模型,我们通过一个线程,就能管理多个IO操作。

    循环内部处理的逻辑,key.isAcceptable()可以认为是判断该事件是否是OP_ACCEPT事件。是的话表示已经有客户端TCP连接连接上了,第15行获取该TCP连接的socket对象。由于是NIO编程,这是获取到的是SocketChannel对象。

    之后将该对象的OP_READ注册到Selector上,发起IO读操作,并且让Selector监听读完成的事件。

    后面的key.isReadable()也是同样的道理,这里只有上面的代码注册了OP_READ事件,因此这里一定是上面的读操作完成了产生的事件。

    Buffer

    上面的代码里,当有新的TCP连接连入时,调用回调函数onAccept;当对方传输数据给自己时,数据读取完成后,调用回调函数onRead。

    下面是这两个回调函数的实现,它的功能很简单:

    当有TCP连接第一次连入时,发送hello\n给对方。

    当接收到对方传来的数据时,原封不动的送回去。大概算是一个echo服务器。

    private void onRead(SocketChannel socketChannel) throws IOException {

    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

    int count;

    while ((count = socketChannel.read(buffer)) > 0) {

    buffer.flip();

    while (buffer.hasRemaining()) {

    socketChannel.write(buffer);

    }

    buffer.clear();

    }

    if (count < 0) {

    socketChannel.close();

    }

    }

    private void onAccept(SocketChannel channel) throws IOException {

    System.out.println(channel.socket().getInetAddress() + "/" + channel.socket().getPort());

    ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

    buffer.put("hello\n".getBytes());

    buffer.flip();

    channel.write(buffer);

    }

    从上面的代码可以看出:

    onRead中的读操作是非阻塞的。在之前数据的网络传输已经完成了,这里只是处理传输完成的数据而已。

    至于这里的写操作是不是阻塞的。。。我觉得不是阻塞的,这一点我还不确定 ,时间有限,之后会经过代码验证,查更多资料去确认这一点。

    所有的读写操作的数据都需要经过Buffer。那为什么要增加Buffer这一抽象概念?直接使用bytes[]不挺好吗?

    我猜测和NIO底层原理有关系,可能OS将数据传输到了操作系统原生的内存里,java使用的话复制到jvm内存中。我也不确定。。。 将来查更多资料去完善这一疑惑吧。

    DEMO效果

    上面通过一个小DEMO,也就是一个简单的ECHO服务器演示了NIO编程。下面来测试下结果:

    frapples:~ ✔> nc -nvv 127.0.0.1 4040

    Connection to 127.0.0.1 4040 port [tcp/*] succeeded!

    hello

    jfldjfl

    jfldjfl

    jfldjflieu

    jfldjflieu

    jfldhgldjfljdl

    jfldhgldjfljdl

    效果不错!不过这还没完。

    尝试开启多个终端,同时连接服务器,你会惊讶的发现,服务器能够完美的同时和多个客户端连接而不会出现“卡死”的情况。

    回顾刚才的小DEMO我们可以发现,刚才的DEMO是 单线程 的,但是通过多路复用模型,却能同时处理多个IO操作。

    底层原理

    硬件机制

    之前在博文《异步IO和同步IO》中也提到了一些异步IO的操作系统机制。

    非阻塞IO需要操作系统机制的支持,在linux系统上,对应的是select/poll系统调用或epoll系统调用。

    操作系统的作用之一是对硬件设备的管理,我们发现,负责运算的部件CPU和负责网络传输的部件网卡,它们是互相独立的,因此,它们实际上可以同时执行任务。那么,底层硬件的支持使得完全可以做到以下步骤:

    CPU发送给网卡某些网络IO操作请求,网卡接收到CPU接收到的请求。

    网卡处理接收到的网络IO操作任务,于此同时,CPU也能执行其它的计算工作。

    当网卡的网络IO操作完成后,通过硬件中断机制给CPU发中断。

    CPU执行中断处理程序,执行IO操作完成后的逻辑。

    这里有个小小的问题,在读取数据的时候,上面的步骤网卡读取数据时显然是不通过CPU的。以我个人有限的硬件知识推测,非阻塞IO的机制可能需要用到DMA。

    仍然是个人推测,以后有时间去查阅相关资料去解决这个疑惑。

    我们可以看到,硬件的运作方式天然就是异步的,也因此,操作系统也非常容易基于此进行抽象和封装,向上提供非阻塞的IO系统调用。

    OS系统调用

    linux操作系统的系统调用提供了多路复用的非阻塞IO的系统调用,这也是java NIO机制实现需要用到的。

    在linux2.6之前,采用select/poll系统调用实现,而在linux2.6之后,采用epoll实现,使用红黑树优化过,也因此性能更高。

    最后

    本篇博文梳理的java的NIO机制,这是一种多路复用模型,能够使用一个线程去管理多个IO操作,避免传统同步IO的线程开销,大大提升性能。

    从我个人的观点,评判一种模型是否易用,一方面来看该模型是否与实际的问题特点相契合;另外一方面,看该模型需要开发者花多少成本在模型本身上而非业务逻辑上。

    从这个标准出发,我们也不难发现,本身异步IO的回调方式就够让开发者头疼的了,然而和异步IO相比,NIO比异步IO还要麻烦。

    你需要花大量精力去时间去处理,去理解NIO本身的逻辑。因此,NIO的缺点是较高的开发成本和较晦涩的代码,不优雅。

    NIO在SOA框架,RPC框架等服务器领域有着较大的应用,除了java标准库的NIO之外,这些实际生产的框架多使用第三方的NIO框架Netty。

    原因之一是,java标准库的NIO有一个bug,可能造成CPU 100%的占用。

    展开全文
  • 异步/同步(被调用者),阻塞/非阻塞(调用者)https://mp.weixin.qq.com/s/TW82I31CVRbKOwJGnTTP8A原创:wangzenghuang[深夜里的程序猿](javascript:void(0);)*4月17日*![]...

    ## 大白话搞懂什么是同步/异步/阻塞/非阻塞

    > 异步/同步(被调用者),阻塞/非阻塞(调用者)

    https://mp.weixin.qq.com/s/TW82I31CVRbKOwJGnTTP8A

    原创:wangzenghuang[深夜里的程序猿](javascript:void(0);)*4月17日*

    ![](https://mmbiz.qpic.cn/mmbiz_jpg/rwAaGIK7HpibOZuuJRuz5SPxZfticte07pGA28AcTEu4iaGPWOwEcySuSj2Zib50qBMGfmibicj4V2GApKYNcoADw1icQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

    ####

    #### **前言**

    在最近的一些面试中,跟应聘者聊了比较多关于“同步/异步,阻塞/非阻塞”相关的话题,发现大家对于这些概念的理解都比较模糊,甚至有的同学会反问“他们不就是同一个东西吗?”。所以借着这么一个机会,我想用一些尽量简单的例子,尽量简洁的语言来聊聊自己对于这些概念的看法。

    #### **正文**

    这篇文章想通过一个老王“候车”的案例来解释这些概念。

    ##### **同步阻塞**

    放假了,老王回到了乡下,由于乡下的基础设施比较差,当他在车站候车的时候,只能一直在干等着,直到公交车的到站。

    这时候对于公交车(被调用着者)来说,它是“同步“的。老王(调用者)被公交车(被调用者)“阻塞”在站台上。

    ##### **异步阻塞**

    放完假了,老王回到了大城市开始上班,同样在车站候车,一样在车站干等着,但是大城市的基础设施建设得比较好,当公交车到站的时候,会有广播提示提醒乘客。

    那么这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会通知调用者。但是此时老王(调用者)还是被公交车(被调用者)“阻塞”在站台上。

    #####

    ##### **同步非阻塞**

    过年了,老王放假回来了乡下,又要开始候车了,这时候他变聪明了,没有一直在车站上干等着,而是去找隔壁的小花叙叙旧。但是又害怕车到站了自己会错过,就只能隔一段时间过来看看车到了没。

    那么这时候对于公交车(被调用着者)来说,它是“同步“的。但是此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的。

    ##### **异步非阻塞**

    改革春风吹满地,新农村建设正在火热进行中,此时的乡下,公交车里面也安装了车辆到站的提醒广播。现在老王在候车的时候,可以安心的跟小花叙旧了,当听到自己需要乘坐的车辆到站广播时,才过去车站上车。

    这时候对于公交车(被调用着者)来说,它是“异步“的,到站后会广播提醒,此时老王(调用者)可以在候车的时候去干其他的的事情,所以他是“非阻塞”的

    ##### **概念总结**

    从上面的示例中,我们可以明白一件事情,同步异步,阻塞非阻塞他们针对的对象是不一样的。对于调用者来说是阻塞跟非阻塞,被调用者是同步跟异步。

    同步:A调用B,此时只有等B有结果了才返回。

    异步: A调用B,B立即返回,无须等待。当B处理完之后会通过通知或者回调函数的方式来告诉A结果。

    阻塞:A调用B,A会被被挂起,一直在等待B的结果,什么事都不能干。

    非阻塞:A调用B,自己用被挂起等待B的结果,可以去干其他的事情。

    ##### **Java中相关概念**

    在Java中的IO模型有三种,分别是BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO(异步非阻塞IO)。这时候我们会发现,异步阻塞的模型是不存在的。

    NIO跟AIO的出现解决了很多在BIO使用过程遇到的难题,所以我们在选择使用何种IO的时候需要根据业务场景来做决定,没必要一味追求NIO跟AIO,不仅加大了编码的难度也提高的出错的概率,技术的出现是为了更好的解决问题。

    #### **结语**

    这篇文章主要是想通过大家熟悉的场景来描述这些概念的含义以及区别,如果想更深入的去钻研的话,大家可以去查阅Linux IO模型相关资料,Java的IO API也是基于这些基础模型来封装的。

    ![](https://mmbiz.qpic.cn/mmbiz_png/rwAaGIK7HpibOZuuJRuz5SPxZfticte07pJOdQWc9iaJuQjGibAybiaT1kQeHTiaJMVwHjhsa732uvTTmtCV2ufwbLhQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

    推荐阅读

    《[Java异常处理最佳实践及陷阱防范](http://mp.weixin.qq.com/s?__biz=MjM5MDA4MjQyNQ==&mid=2465729606&idx=1&sn=90a98fa09b27a8604d978d49cd8dfbe8&chksm=b146985086311146ae7397f6fad7d3491a7aca2351e07cf591b75e5300f95315ea1d6751061f&scene=21#wechat_redirect)》

    《[论JVM爆炸的几种姿势及自救方法](http://mp.weixin.qq.com/s?__biz=MjM5MDA4MjQyNQ==&mid=2465729580&idx=1&sn=78380bb15e9933ccbd4d5c43cc181aa3&chksm=b146983a8631112c31387d170a7c3e9c88df1a32f212536c9ffd1b12fc1d61140900749b1ec9&scene=21#wechat_redirect)》

    《[一文彻底搞懂面试中常问的各种“锁”](http://mp.weixin.qq.com/s?__biz=MjM5MDA4MjQyNQ==&mid=2465729531&idx=1&sn=963212c99b3b5d5f559be70830cba18a&chksm=b1469fed863116fb2a92ff3c8bfd9d2e8b3c39e8d781366b0da94b2c07e2f741fed20a82d36f&scene=21#wechat_redirect)》

    看完本文有收获?请转发分享给朋友吧

    **关注「深夜里的程序猿」,分享最干的干货**

    ![](https://mmbiz.qpic.cn/mmbiz_png/rwAaGIK7Hp97pSKUPiaS2sQWISFqN8Nb4qiaK626B5x0bvCLka2aDeslicR8wW9jv6YT6jOlibDY9VWn0ATDicsHK2A/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

    展开全文
  • 定义:同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反 调用方不会理解...
  • 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞先验知识此处的异步指的是什么同步、异步、阻塞、非阻塞同步阻塞、同步非阻塞、异步阻塞、异步非阻塞一个生动的例子 先验知识   在解释这几个概念之前,需要注意的是:...
  • 同步,异步,阻塞,非阻塞 同步与异步 阻塞与非阻塞 IO模型(Reference Link) ​ 阻塞I/O模型 非阻塞I/O模型 进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作不能满足要求时候,不把本进程...
  • 1.js中多线程-单线程, 同步-异步,阻塞-非阻塞, 回调函数的关系理解 //2018.12.12 1.多线程/单线程 简单理解为: 多线程:程序可以同一时间做几件事. 单线程:程序同一时间只能做一件事. 在...
  • 很多开发者都说JavaScript是单线程的,但是单线程是如何实现异步的呢?然而并没有详细说过,其实JavaScript还有一条或者多条线程用来实现异步操作,也就是异步队列。  举个例子:  马路上有很多车,一辆接一辆的...
  • “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。 1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,...
  • 本文整理转自:... 会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. ...阻塞IO模型(同步),非阻塞IO模型
  • 异步同步阻塞非阻塞并发:同一时刻,单cpu只执行一个任务并行:多CPU同时执行不同任务同步异步对结果而言:同步:上一个任务必须执行完,下一步才能执行异步:下一步的操作不需要等待上一步的完成同步异步同步...
  • 前些天遇到比较坏的面试官,专门问我一些刁钻的问题,像高中试卷一样死扣生僻知识点,提问的方式也充满陷阱,面完感觉受益匪浅,这是其中一个问题。 能把这个概念讲清楚很不容易,这篇文章讲的很好记录一下...阻...
  • 不知原文出处,只记录分享“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous ...
  • 用最简单的话表示同步异步,阻塞非阻塞。 同步异步关注的是消息的通知机制 阻塞非阻塞关注的是等待消息的状态 同步异步关注的是被调用者,阻塞非阻塞关注的...同步非阻塞:我打电话给我电话给女神表白...
  • “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,...
  • “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,...
  • 阻塞和非阻塞同步和异步是node.js里经常遇到的词汇,举例说明: 我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶。我可以: ...
  • 一、阻塞和非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。 概括:关注的是接口调用(发出请求)后等待数据返回时的状态,描述的是一种状态。 阻塞型:被挂起无法执行其他操作的则是阻塞...
  • 阻塞和非阻塞同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明:我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶。...
  • 阻塞和非阻塞同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明: 我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种...
  • 如果小明点击下载按钮之后,就去做其他事情了,不过他总需要时不时瞄一眼屏幕看软件是不是下载完成了,这是同步非阻塞; 如果小明点击下载按钮之后,就去做其他事情了,软件下载完之后「叮」的一声通知小明,小明...
  • cpu如何执行和同步或是异步,阻塞或是非阻塞都是没有必然关系 操作系统始终保证cpu处在运行状态,是通过调度来实现的, 具体一点就是通过在不同的进程线程间切换实现的 3.回调是什么 回调值通过函数参数...
  • 你可能已经听说Node.js是“基于Chrome的V8 JavaScript引擎的异步JavaScript运行的”,并且它“使用事件驱动的非阻塞I / O模型,使其轻量级高效”。但对某些人来说,这不是最好的解释,或许太过于概念化。首先要...
  • NodeJs 异步非阻塞

    2019-09-09 17:04:12
    一般来说,高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步 I/O,系统通过线程切换来弥补同步 I/O 调用的时间开销。比如 Apache 就是这种策略,由于 I/O 一般都是耗时操作,因此...
  • 同步异步是从当前时刻角度看的,阻塞非阻塞是对事件的执行过程来看的。同步是指一个时刻仅有一件事件在执行。异步指一个时刻可以有多个事件同时执行。阻塞指事件执行必须连续,一个事件从开始到结束不能有其他的事件...
  • 使用光纤进行同步和非阻塞(您可以从测试中旋转自己的服务器); 浏览器/窗口/元素概念(易于理解您在哪里应用某个更改); 轻松的多窗口管理; 开箱即用的简单 css 选择器; 带有类型的非常友好的文档; 使用 ...
  • js异步和同步、阻塞和非阻塞、进程线程的总结 1.什么是单线程多线程 在编程语言中,有的语言是多线程的,有的是单线程的,比如java就是多线程的,javascript是单线程的。 也就是说js就像一条流水线,只能在这...
  • 图3:当小红接电话后,说想一想,一会再告诉你结果,然后电话也不挂,一直通话,此时属于同步,但是小明此时偷偷向另外一个妹子打电话表白,这个行为属于非堵塞,结合起来就是同步非阻塞。 队列栈 队列的...
  • 前言在日常的开发中,经常出现同步、异步、阻塞和非阻塞等概念。有些人搞不清楚什么代码是同步,什么代码是异步。有些人说我用异步了啊,为什么效率还是没提高呢?也许你是用异步了,但是可能是异步阻塞...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,118
精华内容 12,447
关键字:

同步阻塞和同步非阻塞js