zoukankan      html  css  js  c++  java
  • Nodejs随笔(三):全局对象之process

    process是全局对象,在任何地方都可以访问,而且它是EventEmitter的一个实例(关于EventEmitter后面会提到)。

    process对象对一些标准的输入输出流进行了封装,如stdin(标准输入)、stdout(标准输出)和stderr(标准错误输出)。其中,stdin和stdout支持异步操作,前者可读,后者可写。stderr是一个同步可阻塞流。

    使用stdin和stdout来读取和写入数据:

    process.stdin.setEncoding('utf-8');
    
    process.stdin.on('readable', function(){
        var chunk = process.stdin.read();
        if(chunk !== null){
            process.stdout.write('data: '+ chunk);
        }
    });
    
    process.stdin.on('end', function(){
        process.stdout.write('end');
    });

      作为流,process.stdin可以在旧模式下使用。为了兼容node v0.10以前的版本。在旧模式喜爱使用stdin必须调用process.stdin.resume()。注意如果调用了process.stdin.resume() stdin将转为旧模式。

    process.stdin.resume();
    
    process.stdin.on('data', function(chunk){
        process.stdout.write('data: ' + chunk);
    });

    上述两者的结果都是:

    mesogene@mesogene-team:~/nodejs-workspace/03process$ node stdin.js 
    adfasfas
    data: adfasfas
    asdfasf
    data: asdfasf
    daddddddddddddddddddddd
    data: daddddddddddddddddddddd
    endmesogene@mesogene-team:~/nodejs-workspace/03process$    #按Ctrl + D时显式end

    process总包含许多属性和方法可以返回当前环境信息,可以查看API:

    > process.version    #Node版本信息
    'v0.12.1'
    > process.execPath    #返回当前Node应用程序的执行路径
    '/usr/local/bin/node'
    > process.platform    #服务器平台信息
    'linux'
    > process.memoryUsage()    #内存使用情况
    { rss: 18534400, heapTotal: 11803648, heapUsed: 6462296 }
    > process.pid        #当前程序的进程号
    4058
    > process.arch      #架构信息
    'x64'
    > process.uptime()  #运行时间
    1782.254
    > 

    下面简单说一下nextTick()方法,详细请看文末参考:

    process.nextTick()将一个回调函数挂载到Node程序的时间循环机制中,在下一个事件循环发生时调用该函数。

    示例1:

    mesogene@mesogene-team:~/nodejs-workspace/03process$ cat nextTick.js 
    console.log('start');
    process.nextTick(function() {
        console.log('nextTick callback');
    });
    console.log('scheduled');
    // Output:
    // start
    // scheduled
    // nextTick callback

    上述程序的运行结果为:

    mesogene@mesogene-team:~/nodejs-workspace/03process$ node nextTick.js 
    start
    scheduled
    nextTick callback

    示例2:

    mesogene@mesogene-team:~/nodejs-workspace/03process$ cat nextTick02.js 
    function foo(options){
        console.log('foo function');
    }
    process.nextTick(foo);
    console.error('bar');

    上述程序的运行结果为:你可以发现bar比'foo function'提前打印了出来.也就是说我们已经将调用foo()推迟到下一个事件循环中.

    mesogene@mesogene-team:~/nodejs-workspace/03process$ node nextTick02.js 
    bar
    foo function

    同样我们采用setTimeout()同样可以达到上述效果。

    mesogene@mesogene-team:~/nodejs-workspace/03process$ cat setTimeoutCompareNextTick02.js 
    function foo(options){
        console.log('foo function');
    }
    setTimeout(foo, 0);
    console.error('bar');

    结果同上:

    mesogene@mesogene-team:~/nodejs-workspace/03process$ node setTimeoutCompareNextTick02.js 
    bar
    foo function

    但是process.nextTick()相对setTimeout()来说是高效的.

    More precisely, process.nextTick() defers the function until a completely new stack. You can call as many functions as you want in the current stack. The function that called nextTick has to return, as well as its parent, all the way up to the root of the stack. Then when the event loop is looking for a new event to execute, your nextTick'ed function will be there in the event queue and execute on a whole new stack.

    参考:http://howtonode.org/understanding-process-next-tick

  • 相关阅读:
    qt tableview中如何添加右键菜单且不可编辑单元格
    C++typedef struct和struct的区别
    Qt5配置winpCap
    C++虚函数和纯虚函数的用法和区别
    c++11 智能指针 unique_ptr、shared_ptr与weak_ptr
    C++ windows进程间通信
    C++并发多线程(一)
    Maven无法下载2.1.7.js7版本的itext依赖
    PostgreSQL
    SQL
  • 原文地址:https://www.cnblogs.com/Richard-xie/p/4392884.html
Copyright © 2011-2022 走看看