• 了不起的Node.js--之四


    阻塞与非阻塞IO

    绝大多数对node.js的讨论都把关注点放在了其处理高并发的能力上。Node框架给开发者提供了构建高性能网络应用的强大能力。

    我使用的开发工具是Mac版的WebStorm,这个工具支持Nodejs,只要按照如下步骤设置即可以支持

    阻塞

    尝试区分下面PHP代码和Node代码有什么不同:

    PHP代码示例:

    //PHP
    print('Hello');
    sleep(5);
    print('World');

    Node代码示例:

    //node
    console.log('Hello');
    setTimeout(function(){
    console.log('World');
    },5000);

    上述代码Node.js使用了回调函数,两者的区别集中在阻塞和非阻塞的区别上。

    PHP sleep()阻塞了线程的执行,程序进入sleep时,就什么事情都不做了。

    而Node.js使用了事件轮询,因此这里setTimeout是非阻塞的。

    如果在setTimeout后再加入console.log语句的话,该语句会被立刻执行:

    console.log('Hello');
    setTimeout(function(){
    console.log('World');
    });
    console.log('Bye');
    
    //这段脚本会输出:
    //Hello
    //Bye
    //World

    采用了事件轮询意味着什么呢?从本质上说,Node会先注册事件,随后不停地询问内核这些事件是否已经分发。当事件分发时,对应的回调函数就会被触发,然后继续执行下去。

    如果没有事件触发,则继续执行其它代码,直到有新事件时,再去执行对应的回调函数。

    和阻塞相反,setTimeout仅仅只是注册了一个事件,而程序继续执行,所以,这是异步的。

    Node并发实现也采用了事件轮询。与timeout所采用的技术一样,所有像http、net这样的原生模块中IO部分也都采用了事件轮询技术。和timeout机制中Node内部会不停地等待,

    并当超时完成时,触发一个消息通知一样,Node使用事件轮询,触发一个和文件描述符相关的通知。

  • 相关阅读:
    SpringBoot整合Elasticsearch
    Elasticsearch环境搭建和介绍(Windows)
    Java并发AtomicBoolean类的使用
    RequestMapping详细用法
    RSA公钥加密 私钥解密
    java随机生成RSA密钥对
    java通过实体类生成数据库表 并生成注释
    设计模式-策略模式
    设计模式-模板方法模式使用
    设计模式-模板方法模式
  • 原文地址:https://www.cnblogs.com/adam/p/3670513.html
Copyright © 2020-2023  润新知