`
wenson
  • 浏览: 1052174 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Node.js中的child_process及进程通信

阅读更多

child_process是Node.js的一个十分重要的模块,通过它可以实现创建多进程,以利用多核计算资源。

Node.js 0.8的child_process模块提供了四个创建子进程的函数,分别是spawnexecexecFilefork。其中spawn是最原始的创建子进程的函数,其他三个都是对spawn不同程度的封装。spawn只能运行指定的程序,参数需要在列表中给出,相当于execvp系统函数,而exec可以直接运行复杂的命令。

例如要运行ls -lh /usr,使用spawn需要写成spawn('ls', ['-lh', '/usr']),而exec只需exec('ls -lh /usr')exec的实现原理是启动了一个系统shell来解析参数,因此可以是非常复杂的命令,包括管道和重定向。此外,exec还可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是errstdoutstderr,非常方便直接使用,例如:

child_process.exec('ls -lh /usr', function(err, stdout, stderr) {
  console.log(stdout);
});

如果使用spawn,则必须写成:

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

execFilespawn的参数相似,也需要分别指定执行的命令和参数,但可以接受一个回调函数,与exec的回调函数相同。它与exec的区别在于不启动独立的shell,因此相比更加轻量级。

fork函数用于直接运行Node.js模块,例如fork('./child.js'),相当于spawn('node', ['./child.js'])。与默认的spawn不同的是,fork会在父进程与子进程直接建立一个IPC管道,用于父子进程之间的通信。例如:

var n = child_process.fork('./child.js');
n.on('message', function(m) {
  console.log('PARENT got message:', m);
});
n.send({ hello: 'world' });

child.js的内容:

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

其中父进程调用fork函数获取一个返回值,作为子进程的句柄,通过send函数发送信息,on('message')监听返回的信息,子进程通过内置的process对象相同的方法与父进程通信。

fork函数有一个问题,就是它只能运行JavaScript代码,如果你喜欢用CoffeeScript(或者其他任何编译到js的语言),是无法通过fork调用的。一个简单的方法是把代码编译到JavaScript再运行,但是很不方便,有没有什么办法呢?

答案是可以的,还是得回到spawn函数。spawn函数除了接受commandargs外,还接受一个options参数。通过把options参数的stdio设为['ipc'],即可在父子进程之间建立IPC管道。例如子进程使用CoffeeScript:

child_process = require('child_process')
options =
  stdio: ['ipc']
child = child_process.spawn 'coffee', ['./child.coffee'], options

其中只要把spawn的第一个参数设置为运行对应脚本的解释器,即可运行,例如使用Continuation.js,只需child = child_process.spawn('continuation', ['./child.coffee'], options)

分享到:
评论

相关推荐

    详解从Node.js的child_process模块来学习父子进程之间的通信

    spawn函数以异步的方式创建子进程,它返回一个ChildProcess实例,这个实例是一个EventEmitter,可以让父进程监听到子进程的不同事件,比如exit、error和close事件。spawn的优点是不会阻塞Node.js的事件循环,适用于...

    node的process以及child_process模块学习笔记

    总结来说,`process`对象和`child_process`模块是Node.js进行进程管理和跨进程通信的关键工具,它们帮助开发者充分利用多核CPU资源,提高程序性能和稳定性。通过理解和熟练运用这些特性,可以编写出更高效、更健壮的...

    Node.js中child_process实现多进程

    fork() 方法是 child_process 模块中比较高级的抽象,它背后的工作机制是:父进程通过 fork() 启动一个子进程,并且父子进程可以通过 IPC(进程间通信)通道进行通信。子进程在创建后会执行指定的 Node.js 脚本,父...

    nodejs父子进程的stream方式通信.zip_cameraodl_nodejs 进程通信_nodejs父子进程通信_spa

    本文将深入探讨如何使用stream方式实现Node.js中的父子进程通信,特别是针对使用`spawn`方法创建的子进程。首先,我们了解下父子进程的概念。 **父子进程**: 在操作系统中,一个已经存在的进程(父进程)可以创建...

    Node.js中创建和管理外部进程详解

    在Node.js中,创建和管理外部进程是通过`child_process`模块实现的,这个模块提供了多种方式来执行外部命令和与子进程进行交互。当处理CPU密集型任务或需要执行系统命令时,使用子进程可以避免阻塞Node.js的事件循环...

    Node.js中的child_process模块详解

    在Node.js中,`child_process`模块是一个核心模块,它允许开发者创建和管理子进程。这个模块对于处理需要执行系统命令、运行外部程序或者进行CPU密集型计算等场景特别有用,因为Node.js本身是单线程的,处理这样的...

    4-child_process (子进程).pdf

    在Node.js中,`child_process`模块是用于创建和管理子进程的核心模块,它提供了多种方式来执行外部程序,如操作系统命令或者独立的Node.js进程。这个模块在互联网开发中非常常见,因为开发者经常需要与操作系统进行...

    Node项目pkg打包ES6,以及多进程child-process.fork方式

    标题 "Node项目pkg打包ES6,以及多进程child-process.fork方式" 提及了两个主要知识点:使用pkg打包Node.js项目以及在项目中应用ES6语法,并通过`child_process.fork`实现多进程处理。 首先,让我们深入了解一下**...

    Node.js-fkill-杀死进程跨平台支持

    在Node.js中,`child_process`模块提供了子进程通信的能力,允许我们执行系统命令。在fkill的实现中,它使用了`ps-list`库来获取当前系统中的进程列表,并通过用户输入的进程ID或名字来筛选出目标进程。接着,`cross...

    详解node child_process模块学习笔记

    Child Process 模块给予 Node.js 任意创建子进程的能力,官方文档中提供了四种方法来创建子进程。 1. child_process.exec(command[, options][, callback]) child_process.exec() 方法可以启动子进程来执行 shell ...

    child_process:直接替换child_process NodeJS包

    在Node.js环境中,`child_process`模块是核心的一部分,它提供了与子进程进行交互的能力,包括执行外部命令、管理子进程的输入/输出/错误流以及处理子进程的信号等。这个模块对于开发者来说非常重要,因为它允许我们...

    code4node.js_in_action:来自于《 node.js实战》的源码,改了些API,适应node 10.6.0版本

    7. **child_process模块**:Node.js的子进程模块可能会有一些改进,如增加新的API或者提高与子进程通信的稳定性。 8. **加密模块**:可能更新了加密算法库,提高了安全性。 9. **File System (fs) 模块**:可能对...

    Node.js-可以用在一个spectacleslidedeck中的终端组件

    2. **集成child_process**:在组件内部,我们可以利用Node.js的child_process模块来执行用户在模拟终端中输入的命令。通过`spawn`或`exec`方法可以运行命令,并获取命令的输出,然后更新组件的状态,显示在输出区域...

    Node.js-管理你NodeJS进程的生命周期

    在Node.js中,主进程(main process)通常是通过执行一个JavaScript文件开始的,这个文件被称为`入口文件`。你可以通过`process.argv`获取到启动命令行参数,以便在启动时进行自定义配置。 二、事件循环与异步处理 ...

    Node.js-一个简易版的Node进程池用来解决并行任务的处理

    在处理大量并发任务时,Node.js 的单线程模型可能会成为性能瓶颈,这时我们可以利用 Node.js 的子进程(child_process)模块来创建进程池,以实现并行处理,提高效率。 标题中的 "Node.js-一个简易版的Node进程池...

    Node.js-telnet上的俄罗斯方块

    Node.js的异步特性可以很好地处理这个问题,但可能还需要使用`child_process`模块创建子进程来处理每个玩家的游戏实例,以避免内存占用过多。 6. **实时同步**:为了让所有玩家看到相同的游戏状态,我们需要实现一...

    Node.js-Termbox通过Web界面提供即时Linux终端访问

    2. **连接到Linux终端**:在服务器端,使用`child_process`模块创建一个子进程,通过`pty.js`或`xterm-pty`等库连接到Linux终端。 3. **实时通信**:设置WebSocket服务器,将Termbox获取的终端输出和用户输入事件...

    professional_node.js

    - 讲解了如何使用child_process模块来启动、通信和管理子进程,这对于集成第三方命令行工具或执行后台任务非常有用。 - **读写数据流**(第九章) - 数据流(如文件流、网络流等)是Node.js中处理大量数据的重要...

Global site tag (gtag.js) - Google Analytics