Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1478724
  • 博文数量: 148
  • 博客积分: 2234
  • 博客等级: 大尉
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 21:34
个人简介

未来很长。

文章存档

2017年(7)

2016年(4)

2015年(1)

2014年(6)

2013年(31)

2012年(99)

分类: LINUX

2013-12-12 15:01:26

是Node.js的一個十分重要的模塊,通过它可以实现创建多进程躲进查查,以利用多核計算資源。

Node.js 0.8的child_process模塊提供了四个创建子进程的函数,分別是spawn,exec,execFile和fork。其中spawn是最原始的创建子进程子进程的函數,其他三个都是对spawn不同程度的封裝。spawn只能进行指定的程序,参数需要在列表中給出,相当于execvp系统函数,而exec可以直接運行複雜的命令。

例如要運行ls -lh /usr,使用spawn需要寫成spawn('ls', ['-lh', '/usr']),而exec只需exec('ls -lh /usr')。exec的實現原理是啓動了一個系統shell來解析參數,因此可以是非常複雜的命令,包括管道和重定向。此外,exec還可以直接接受一個回調函數作爲參數,回調函數有三個參數,分別是err, stdout, stderr,非常方便直接使用,例如:

点击(此处)折叠或打开

  1. child_process.exec('ls -lh /usr', function(err, stdout, stderr) {
  2.   console.log(stdout);
  3. });
如果使用spawn,則必須寫成:

点击(此处)折叠或打开

  1. child = child_process.spawn('ls', ['-lh', '/usr']);
  2. child.stdout.setEncoding('utf8');
  3. child.stdout.on('data', function(data) {
  4.   console.log(data);
  5. });

execFile與spawn的參數相似,也需要分別指定執行的命令和參數,但可以接受一個回調函數,與exec的回調函數相同。它與exec的區別在於不啓動獨立的shell,因此相比更加輕量級。

fork函數用於直接運行Node.js模塊,例如fork('./child.js'),相當於spawn('node', ['./child.js'])。與默認的spawn不同的是,fork會在父進程與子進程直接建立一個IPC管道,用於父子進程之間的通信。例如:


点击(此处)折叠或打开

  1. var n = child_process.fork('./child.js');
  2. n.on('message', function(m) {
  3.   console.log('PARENT got message:', m);
  4. });
  5. n.send({ hello: 'world' });
child.js的內容:

点击(此处)折叠或打开

  1. process.on('message', function(m) {
  2.   console.log('CHILD got message:', m);
  3. });
  4. process.send({ foo: 'bar' });

其中父進程調用fork函數獲取一個返回值,作爲子進程的句柄,通過send函數發送信息,on('message')監聽返回的信息,子進程通過內置的process對象相同的方法與父進程通信。

fork函數有一個問題,就是它只能運行JavaScript代碼,如果你喜歡用CoffeeScript(或者其他任何編譯到js的語言),是無法通過fork調用的。一個簡單的方法是把代碼編譯到JavaScript再運行,但是很不方便,有沒有什麼辦法呢?

答案是可以的,還是得回到spawn函數。spawn函數除了接受command, args外,還接受一個options參數。通過把options參數的stdio設爲['ipc'],即可在父子進程之間建立IPC管道。例如子進程使用CoffeeScript:

点击(此处)折叠或打开

  1. child_process = require('child_process')
  2. options =
  3.   stdio: ['ipc']
  4. child = child_process.spawn 'coffee', ['./child.coffee'], options
其中只要把spawn的第一個參數設置爲運行對應腳本的解釋器,即可運行,例如使用,只需child = child_process.spawn('continuation', ['./child.coffee'], options)。




阅读(8327) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~