当我们需要在Node.js应用程序中执行一些长时间运行的任务或与其他应用程序交互时,我们可以使用child process模块创建子进程。
在Node.js中创建子进程,可以使用child_process模块。该模块提供了4个不同的方法。他们分别是:
- exec
- spawn
- fork
- execFile
下面我们分别讲解这4个方法。
exec方法
exec()方法创建了一个shell子进程,并在shell中运行命令。当命令完成后,将回调给指定的函数,并返回输出、stdout和stderr。
下面是一个exec()方法的示例:
const { exec } = require('child_process')
exec('ls -la', (error, stdout, stderr) => {
if (error) {
console.log(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
})
上述代码将在shell中执行“ls -la”命令,并在命令执行完毕后打印stdout和stderr的输出结果。
spawn方法
spawn()方法异步地生成子进程,与exec()方法不同,它没有生成一个shell,而是将指定的命令(和任何参数)直接传递给生成的进程。此外,spawn()方法返回一个Object,该对象具有输出流和输入流,可以用于与子进程之间的通信。
下面是一个spawn()方法的示例:
const { spawn } = require('child_process')
const ls = spawn('ls', ['-la'])
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`)
})
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`)
})
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`)
})
上述代码首先使用spawn()方法异步生成一个子进程,并将“ls”命令和“-la”参数作为spawn()方法的参数。生成的ls对象具有stdout和stderr输出流,我们可以像上面的代码一样使用它们来监听输出结果。
当子进程关闭时,将调用close时间,我们可以在这个事件中获取到子进程的退出码。
fork方法
与spawn()方法类似,fork()方法也是生成一个子进程,此方法专用于生成Node.js进程。使用fork()方法是为了方便而不必为生成子进程编写IPC通信机制。
下面是一个fork()方法的示例:
server.js
文件:
const { fork } = require('child_process')
const child = fork('./child.js')
child.on('message', (message) => {
console.log(`child sends message: ${message}`)
})
child.send('parent sends message to child')
child.js
文件:
process.on('message', (message) => {
console.log(`parent sends message: ${message}`)
})
process.send('child sends message to parent')
上述代码中,我们首先使用fork()方法生成一个子进程,并将child.js
作为参数传递给该方法。在主进程中,我们使用子进程的send()方法向子进程发送消息,并在子进程中使用process对象监听message事件获取消息。
同样的,在子进程中,我们使用process对象监听message事件获取父进程发送的信息,并使用send()方法向父进程发送消息。
execFile方法
execFile()方法类似于exec()方法,但它不会创建一个shell进程,而是直接在子进程中执行指定的可执行文件。
下面是一个execFile()方法的示例:
const { execFile } = require('child_process')
execFile('ls', ['-la'], (error, stdout, stderr) => {
if (error) {
console.log(`execFile error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
})
上述代码中,我们使用execFile()方法在子进程中执行“ls -la”命令,并在命令执行完成后打印stdout和stderr的输出结果。
这就是关于在Node.js中创建子进程的4个方法的详细讲解,并且提供了2个方法的示例。使用时,应该根据实际情况选择最合适的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在nodejs中创建child process的方法 - Python技术站