zoukankan      html  css  js  c++  java
  • Nodejs

    nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。

    图解NodeJS【基于事件、回调的单线程高性能服务器】原理

    轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。

    理想的异步I/O应该是应用程序发起异步调用,而不需要进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调将数据传递给应用程序即可。

    Node只是表面暴露给用户的javascript代码是单线程的,底层还是多线程的。

    Node.js选择的异步I/O方案:由于Windows平台和*nix平台的差异,Node.js提供了libuv来作为抽象封装层,使得所有平台兼容性的判断都由这一层次来完成,保证上层的Node.js与下层的libeio/libev及IOCP之间各自独立。Node.js在编译期间会判断平台条件,选择性编译unix目录或是win目录下的源文件到目标程序中。

    每次循环中,它会调用IOCP相关的GetQueuedCompletionStatus方法检查是否线程池中有执行完的请求,如果存在,poll操作会将请求对象加入到loop的pending_reqs_tail属性上。 另一边这个循环也会不断检查loop对象上的pending_reqs_tail引用,如果有可用的请求对象,就取出请求对象的result属性作为结果传递给oncomplete_sym执行,以此达到调用JavaScript中传入的回调函数的目的。 至此,整个异步I/O的流程完成结束。其流程如下:

    初探Node.js的异步I/O实现

    使用Node的时候,会在javascript触发一些命令调用方法,这些方法会被包装成一个对象,放入线程池,然后前面的方法就返回了,继续执行下面的JS代码。

    线程池中采用多线程的方式执行,执行完的对象放入事件循环队列。

    事件循环队列采用类似while(true)这种循环的方式,不断的查看是否有事件,并且读取是否包含回调,由于前面回调函数被包装到对象中,这里直接调用执行就可以了。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------

    • npm:NodeJs包管理器
    • express:服务器端比较流行的MVC框架,处理服务请求,路由转发,逻辑处理
    • mongoose:mongodb包装,更方便使用数据库
    • :实现服务端和客户端socket通信解决方案
    • backbone:客户端MVC框架,编写客户端应用(豆瓣说)
    • coffeescript:提高JavaScript的可读性,健壮性
    • zombie:浏览器子集,编写html解析器,轻形javascript客户端测试

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1、进入 http://nodejs.org 下载开发环境

    http://Expressjs.com 下载安装Express  npm install -g express

    继续安装ejs:npm install ejs

    如果要想运行Node.js程序,则现在只能够使用“node app.js”,而这样的运行方式,如果在app.js文件修改之后往往需要重新启动才可以加载新的内容,这对于开发是非常不方便的, 为此,可以使用一个supervisor组件包,它可以动态的加载修改之后的开发程序。

    下载安装supervisor

    npm install -g supervisor

    利用supervisor方式运行程序

    supervisor app.js

    2、调试代码:进入npm目录安装supervisor。 -g 表示全局模式 
    npm install -supervisor -g
     安装supervisor 来控制调试代码。 不需要每次停止重启node.js的服务
    使用supervisor app.js启动
     
    3、开发工具 WebStorm http://www.jetbrains.com    tools 下载30天试用版
     
    4、回调函数:调用时所做的工作知识将异步式IO请求发送给了操作系统,然后立即返回并执行后面的语句,执行完以后进入事件循环监听事件,当fs接受到IO请求完成的事件时。事件循环会主动调用回调函数完成后续工作。同步则是阻塞等待完成后,继续执行。
     
    5、事件
                a.普通事件的使用
                        //声明事件对象`
                        var EventEmitter=require('events').EventEmitter;
                        var event=new EventEmitter();
                        //注册事件
                         event.on('some_event',function(){
                            console.log('这是一个自定义的事件');
                        });
                        //触发事件
                        setTimeout(function(){
                            event.emit('some_event');
                        },1000);
                b.Node.js的事件循环机制
                    (1)Node.js在什么时候进入事件循环呢?
                            Node.js程序是由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数。
                    (2)如何使用自定义事件呢?
                            事件的回调函数在执行的过程中,可能会发出IO请求或直接发射(emit)事件,执行完毕后再返回事件循环。

    6、模块:Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即获取模块的exports对象。exports本身仅仅是一个普通的空对象,即{},它是专门用来声明接口

    7、包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它讲某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。npm解决包的发布和获取需求。

     Node.js包管理器,即npm是Node.js官方提供的包管理工具,它已经成了Node.js包的标准发布平台,用于Node.js包的发布、传播、依赖控制。
                    (1)获取一个包
                            npm [install/i] [package_name]       
                           例如安装express包:
                            npm i express
                     卸载包:
                        npm uninstall 包名 [-g]
                      查看当前所有包:
                        npm list
                       ....
                        帮助链接:http://www.cnblogs.com/bluefrog/archive/2012/08/14/2639085.html
                    (2)本地模式和全局模式
                            npm在默认情况下会从http://npmjs.org搜索或下载包,讲包安装到当前目录的node_modules  
                            a.默认是npm install 包名   作为本地模式
                            b.全局模式
                                npm install -g 包名
                            c.区别和用法
                                    因为本地模式不会注册PATH环境变量,举例,我们安装supervisor是为了在命令行中运行它,譬如直接运行supervisor scirpt.js。
                                    npm本地模式仅仅把包安装到了node_modules子目录下,其中的bin目录没有包含在PATH环境变量中,调用。不能直接在命令行中
                                    使用全局模式安装的包并不能直接在javascript文件中require获得,因为require不会搜索/usr/local/lib/node_modules。
                        
                            通俗讲:当我们要把某个包作为工程运行时的一部分时,通过本地模式获取,如果在命令行下使用,则使用全局模式。
                            d.包的发布
                                   首选确保具备CommonJS为基础包的规范,但与CommJS并不完全一致,其主要差别在于必填字段的不同,通过使用npm init可以根据交互式问答产生一个符合标准的package.json
                             dos进入这个目录运行 npm init得到package.json的文件,改成自己的文件等信息
                            然后进入package.json所在目录运行  npm publish  就完成了发布
                             如何更新包?
                                如果你的包内容有改动,则在版本上作改动,运行npm publish
                                访问http://search/npmjs.org/就可以找到自己刚刚发布的包了                          如何取消发布:
                                   npm unpublish     

    8、调试代码

                            在eclipse装插件
                                    地址是 http://chromedevtools.googlecode.com/svn/update/dev/
                                     在debug中配置  端口为5858 
                            在命令行运行js文件的时候
                                    node --debug-brk=5858 文件名.js
                            现在就在ecplise中启动debug就可以跟断点了
                        Google Dart
     
    9、全局对象与全局变量:所有属性都可以在程序的任何地方访问,即全局变量。在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console、process等。
     
    10、
  • 相关阅读:
    查看单据项目文本对应的参数信息
    下载EPM包详细运行日志
    ABAP 字符串换行符处理
    PyCharm编辑HTML文件时输入{%不能自动补全
    Ubuntu 18.04安装MongoDB 4.0
    ubuntu18.04(bionic) 配置阿里数据源
    【Python】迭代器
    【python】多任务(2. 进程)
    【python】多任务(1. 线程)
    【python】文件下载---基础版
  • 原文地址:https://www.cnblogs.com/ecollab/p/7541457.html
Copyright © 2011-2022 走看看