`

Node.js之child_process(子进程)

阅读更多
背景知识:

    Every node.js process is single threaded by design. Therefore to get multiple threads, you have to have multiple processes(As some other posters have pointed out, there are also libraries you can link to that will give you the ability to work with threads in Node)

    每一个 node.js 的进程都是单线程的。因此要想有多个线程,只能创建多个进程。
    当然,已经出现了,可以在一个进程中创建多个线程的库。

    但,本文锁定的是:如何使用 node.js 创建多个进程。


1、child_process

    child_process 模块提供了类似于,但不完全相同于 popen(3) 的创建子进程的方法。


2、什么是 popen(3)

    popen(3) 是一个 Linux 系统的命令。

    popen() 函数用于创建一个进程,它的实现方法通过创建 pipe, forking, 然后调用 shell 。
    由于 pipe 定义时是单向的,所以只能执行单向操作:或进行读操作,或进行写操作;但不能同时进行读写操作。


3、child_process API 说明

    child_process 拥有3个流(这3个流可以被父进程的 stdio 流使用 ):

        1)输入流:child.stdin
        2)输出流:child.stdout
        3)错误流:child.stderr

   
    Node.js 提供的 child_process 主要有下面3种用法:

        1)exec − child_process.exec() 方法在 shell 中运行一个系统命令,并缓存输出的结果。
        2)spawn − child_process.spawn() 使用给定的系统命令启动一个子线程。
        3)fork − child_process.fork() 是 child_process.spawn()的特别情况下的用法,也是启动一个子线程。


4、使用实例


//task.js

console.log('processing in background...');

for(var i = 0; i < 99999999999; i++){} // simulate waiting for a long time.

console.log("processing finished!");

//end



//app.js

var express = require('express');
var app = express();
var child_process = require('child_process');

app.get('/', function (req, res) {
    console.log("A User require: Hello World!");
    res.send('Hello World!');
});

app.get('/echo', function (req, res) {
    var worker_process = child_process.fork("task.js");
    worker_process.on('close', function (code) {
       console.log('child process exited with code ' + code);
    });
});

app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.status(404).send('Resource Not Found!');
    res.status(500).send('System Error!');
    next();
});

app.listen(3000, function () {
    console.log('Server app listening on port 3000!');
});





改进版:

    增加了请求超时,返回。


//app.js

var express = require('express');
var app = express();
var child_process = require('child_process');
var port = 3000;

app.get('/', function (req, res) {
    console.log("A User require: Hello World!");
    res.send('Hello World!');
});

app.get('/echo',function(req,res){
    var run = function(){
        var isTimeout = false,
            isCallback = false;
        return function(){
            var worker_process = child_process.fork('./task.js');
            worker_process.on('message',function(data){
                if(isTimeout) return;
                isCallback = true;
                res.send(data);
            });
            setTimeout(function(){
                if(isCallback) return;
                isTimeout = true;
                worker_process.kill();
                res.send({result:'time is out'});
            },1000*60);
        }
    }();
    run();
});

app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.status(404).send('Resource Not Found!');
    res.status(500).send('System Error!');
    next();
});

app.listen(port, function () {
    console.log('Server app listening on port ' + port );
});








引用:

POPEN(3) - Linux Programmer's Manual
http://man7.org/linux/man-pages/man3/popen.3.html

How to create threads in nodejs
http://stackoverflow.com/a/18613311/2893073

Node.js - Scaling Application
https://www.tutorialspoint.com/nodejs/nodejs_scaling_application.htm

Node.js - 子进程
https://nodejs.org/api/child_process.html

Node.js - Cluster
https://nodejs.org/api/cluster.html






分享到:
评论

相关推荐

    node.js中process进程的概念和child_process子进程模块的使用方法示例

    主要介绍了node.js中process进程的概念和child_process子进程模块的使用方法,结合实例形式分析了node.js中process进程和child_process子进程模块相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下

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

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

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

    接下来,我们讨论`child_process`模块,它是Node.js中用于创建子进程的工具。由于Node.js默认是单线程的,当遇到CPU密集型任务时,可能导致阻塞。`child_process`模块允许我们创建子进程来分担计算负载,子进程间...

    Node.js中child_process实现多进程

    child_process 模块提供了几种方法来创建子进程,其中 fork() 方法被用来创建一个子进程来执行 Node.js 脚本。 fork() 方法是 child_process 模块中比较高级的抽象,它背后的工作机制是:父进程通过 fork() 启动一...

    child-process-ctor-Node.js4childProcess.ChildProcessponyfill.

    `child-process-ctor-Node.js4childProcess.ChildProcessponyfill`是一个针对Node.js v4版本的`ChildProcess`构造函数的兼容性库,它允许开发者在旧版本Node.js环境中使用与新版本相同的方法来创建和管理子进程。...

    4-child_process (子进程).pdf

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

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

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

    Node.js中的child_process模块详解

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

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

    `child_process.fork()`用于创建Node.js子进程,而`child_process.spawn()`则可以启动任意类型的进程,如Java或C。 **stream方式通信**: 在Node.js中,`spawn`创建的子进程默认不包含与父进程的通信管道。为了实现...

    Node.js-exec-file-sync-Node.js0.12childProcess.execFileSync()ponyfill

    在Node.js环境中,`childProcess`模块是用于与子进程进行交互的核心模块,它提供了多种方法来执行外部命令行程序并获取其输出。在描述中提到的`execFileSync()`是其中一个同步版本的方法,用于在Node.js 0.12及更低...

    利用NodeJS的子进程(child_process)调用系统命令的方法分享

    NodeJS的子进程模块`child_process`是开发者与操作系统进行交互的重要工具,它允许我们创建新的进程,并且能够执行系统命令。子进程提供了一系列API,包括处理标准输入、标准输出和标准错误输出的能力,这对于执行...

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

    在Node.js中,`child_process`模块提供了与子进程进行通信的能力。`fork()`方法特别用于创建一个新的Node.js进程,它在子进程中执行指定的模块。子进程可以通过进程间通信(IPC)通道与父进程通信,这使得处理复杂...

    使用promises的“child_process”模块的简单包装器_JavaScript_下载.zip

    在JavaScript的世界里,`child_process`模块是Node.js的核心模块之一,它允许开发者在Node.js应用中执行子进程,这通常用于运行系统命令或者与其他非JavaScript应用程序交互。然而,由于Node.js早期版本不支持...

    Node.js-Node.js实现Git分布式自动化部署系统

    2. **Node.js基础**:熟悉Node.js的环境搭建,了解JavaScript编程,以及Node.js中的核心模块如fs(文件系统)、child_process(子进程)等。 3. **Git钩子**:学习如何编写Git钩子脚本,如pre-commit用于验证提交,...

    详解node child_process模块学习笔记

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

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

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

    Node.js v0.6.11用户手册CHM版

    4. **进程与线程**:讲解process对象以及子进程(child_process)模块,它们用于管理Node.js进程及其子进程的交互。 5. **错误处理**:描述了Node.js中的错误处理机制,包括抛出异常、监听error事件以及全局的...

Global site tag (gtag.js) - Google Analytics