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()来说是高效的.

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

相关文章: