`

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的child_process模块来学习父子进程之间的通信

    主要介绍了从Node.js的child_process模块来学习父子进程之间的通信,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

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

    本文实例讲述了node.js中process进程的概念和child_process子进程模块的使用方法。分享给大家供大家参考,具体如下: 进程,你可以把它理解成一个正在运行的程序。node.js中每个应用程序都是进程类的实例对象。 node...

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

    NodeJS子进程简介 NodeJS子进程提供了与系统交互的重要接口,其主要API有: ...child.pid 提供生成子进程的重要方法:child_process.spawn(cmd, args=[], [options]) 提供直接执行系统命令的重要方法:child_process

    利用node.js如何创建子进程详解

    前言 node本身为单进程,并使用驱动...child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式。Process模块也是ChildProcess对象。当你从父模块访问process时,它是父ChildProcess

    详细分析Node.js 多进程

    Node 提供了 child_process 模块来创建子进程,方法有: exec – child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。 spawn – child_process.

    node-child-process-async:覆盖Node的child_process模块​​的最佳方法w Promises

    子进程异步 覆盖 Node的模块的最佳方法 child-process-async提供了对原始child_process函数的直接替代,而不仅仅是返回Promise的重复方法。 所以,当你调用exec&#40;...&#41;我们还是回到一个ChildProcess的实例,只...

    node-v8.5.0-x64.msi

    child_process - 子进程 cluster - 集群 console - 控制台 crypto - 加密 dgram - 数据报 dns - 域名服务器 Error - 异常 events - 事件 fs - 文件系统 global - 全局变量 http - HTTP https - HTTPS module - 模块 ...

    child-process-ctor:Node.js 4.0`childProcess.ChildProcess` ponyfill

    子进程控制器 Node.js 4 安装 $ npm install --save child-process-ctor用法 var childProcessCtor = require ( 'child-process-ctor' ) ;console . log ( typeof childProcessCtor ( ) . prototype . spawn ) ;//=&gt;...

    node-child-io:超时执行 child_process

    创建子进程以安全执行危险的(例如用户制作的)功能。 ##Install 要从安装最新版本,请运行: npm install child-io ##用法 var io = require('child-io').IO([argv]); io.exec&#40;func | file, [options]&#...

    nodejs_childprocess_sample:生成子进程的 Node.js 应用程序 (python)

    nodejs_childprocess_sample 生成子进程的 Node.js 应用程序 (python) 基于:

    利用Node.js编写跨平台的spawn语句详解

    前言 Node.js 是跨平台的,也就是说它能运行在 Windows、OSX ...Node.js 的子进程 (child_process) 模块下有一 spawn 函数,可以用于调用系统上的命令,如在 Linux, macOS 等系统上,我们可以执行 const spawn = requi

    前端开源库-child-process-ext

    前端开源库-child-process-ext子进程ext,node.js子进程模块的扩展

    Node.JS实战24:分离子进程。

    通过前面几文的学习我们知道,通过使用execFile、spawn、exec可以打开外部...var cp = require(child_process); cp.spawn(notepad,[],{detached:true},function(err,stdout,stderr){ if(err){ console.error(err);

    nodejs基础之多进程实例详解

    本文实例讲述了nodejs基础之多进程。分享给大家供大家参考,具体如下: ...Node 提供了 child_process 模块来创建子进程,方法有: exec – child_process.exec 使用子进程执行命令,缓存子进程的

    tadpole:Node 的 child_process 变得简单

    #Tadpole - Node 的 child_process 变得简单 ##About Tadpole Tadpole 消除了多线程 JavaScript 的痛苦。 使用 Node 的 child_process 模块和 Bluebird promise 库,可以很容易地在其他进程中运行代码,同时保持 ...

    Node.js v6.10.2 中文文档、包含英文

    Child Processes (子进程) Cluster (集群) CLI (命令行选项) Console (控制台) Crypto (加密) Debugger (调试器) DNS (域名服务器) Domain (域) Error (错误) Events (事件) File System (文件系统) Global (全局...

    Node.JS实战25:重要!大运算量?用Fork、让子进程来做!

    实际项目中,很多时候都会有这种情况: 某些功能是有大数据量运算的,或者进行很消耗资源的操作。 这种情况下,如果在主线程中...约定:主进程标识为father,子进程标识为child。 father.js代码: var cp = require

    Node.js中的cluster模块深入解读

    预备知识 在如今机器的CPU都是多核的背景...cluster借助child_process模块的fork()方法来创建子进程,通过fork方式创建的子进程与父进程之间建立了IPC通道,支持双向通信。 cluster模块最早出现在node.js v0.8版本中

    Electron 调用命令行(cmd)

    因为最近的项目需求,...child_process 是 Node.js 的内置模块,该模块提供了衍生子进程的能力。 实现代码: const exec = require('child_process').exec export function start () { // 任何你期望执行的cmd命令,

Global site tag (gtag.js) - Google Analytics