• node.js中对同步,异步,阻塞与非阻塞的理解


    我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了。

    javascript为什么是单线程的,这么做有什么好处?

    因为历史原因,js的出现主要是为了解决页面的交互和操作DOM,如果是多线程的,就会带来比较复杂的同步问题。

    比如两个线程同时操作一个DOM,那最终页面显示上会以哪个线程操作为准,这就是个问题。而单线程就没有这种问题。

    创建线程是需要消耗资源的,早期js是嵌在网页中被浏览器解释运行的,如果是多线程那必然会消耗比较多的资源,显然与js的定位不符。

    还有多线程之间的上下文切换也会比较消耗时间,这也是js是单线程的原因,估计js单线程这个特征以后也不会改变。

    单线程的好处:1、没有线程间同步问题。2、节省创建线程资源。3、节省上下文切换时间。

    但是单线程也有问题,所有的操作都必须一个一个来,如果中间有一个操作非常耗时,那整个运行都会阻塞在那里。

    为了解决这个问题,js引入了事件和回调函数机制,对于一个IO操作,比如一个ajax,当发出一个异步请求后,程序不会阻塞在那里等待结果的返回,而是继续执行下面的代码。

    当请求成功获取到结果后,就会调用回调函数来处理后面的事情,这个就是异步的非阻塞。

    当然,异步 与 非阻塞,同步 与 阻塞,这两者之间概念很容易搞混。 

    一、同步与异步关注的是消息的通知方式。

    同步,当发起一个调用时,在没有获取结果之前,调用不会返回,直到获取结果。事一件一件做,做完一件再做下一件。

    异步,当发起一个调用时,在没有获取结果之前,调用就返回了,调用者并不会立即得到结果,而是被调用者通知调用者。通过回调函数处理结果。

    二、阻塞与非阻塞关注的是等待结果(返回值)时的状态

    阻塞,在等待结果的过程中,不能干其他事,线程被挂起,直到结果返回。

    非阻塞,在等待结果的过程中,还能干其他事,线程不会被阻塞。

    同步阻塞方式:

    比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边不干别的,就一直等啊等,电话始终未挂,直到她说吃火锅,电话才挂掉。

    同步非阻塞方式:

    比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边该干什么干什么,电话始终未挂,直到她说吃火锅,电话才挂掉。

    异步阻塞方式:

    比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边什么也没干,就一直等着这个电话。

    异步非阻塞方式:

    比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边想干什么干什么,如果有电话来了,再处理电话。

    同步与异步是被调用方决定的,决定是马上给你答案,还是过会通知你,给你答案。

    阻塞与非阻塞是调用方决定的,在等待结果的过程中, 是否还可以干其他事。

    转载于:https://www.cnblogs.com/jkko123/p/10221100.html

  • 相关阅读:
    Spark研究笔记7:重要的工厂类UserManager(原创) CVT
    Spark研究笔记9:重要的工厂类PresenceManager(原创) CVT
    Spark研究笔记11:实体类 CVT
    Spark研究笔记5:重要的工厂类NativeManager(原创) CVT
    Spark研究笔记8:重要的工厂类PluginManager(原创) CVT
    Spark研究笔记6:重要的工厂类SessionManager(原创) CVT
    Spark研究笔记12:监听类 CVT
    Spark研究笔记10:重要的工厂类SoundManager(原创) CVT
    声明和定义的区别
    LINQ查询操作符
  • 原文地址:https://www.cnblogs.com/xiaosongJiang/p/13538576.html
Copyright © 2020-2023  润新知