Node.js中child_process实现多进程


Posted in Javascript onFebruary 03, 2015
var http = require('http');

function fib (n) {

    if (n < 2) {

        return 1;

    } else {

        return fib(n - 2) + fib(n - 1);

    }

}

var server = http.createServer(function (req, res) {

    var num = parseInt(req.url.substring(1), 10);

    res.writeHead(200);

    res.end(fib(num) + "\n");

});

server.listen(8000);

以上示例提供了一个斐波纳契数列的计算服务,由于此计算相当耗时,且是单线程,当同时有多个请求时只能处理一个,通过child_process.fork()就可以解决此问题

这里引用一下官网上的一个示例,通过这个例子可以很好的理解fork()的功能

var cp = require('child_process');

var n = cp.fork(__dirname + '/sub.js');

n.on('message', function(m) {

  console.log('PARENT got message:', m);

});

n.send({ hello: 'world' });

执行上述代码片段的运行结果:

PARENT got message: { foo: 'bar' }

CHILD got message: { hello: 'world' }

sub.js的内容如下:

process.on('message', function(m) {

  console.log('CHILD got message:', m);

});

process.send({ foo: 'bar' });

在子进程中process对象有send()方法,同时它在每一次接收到消息时都会发布消息对象

有点晕的是:child.send()发送的消息,是由process.on()方法接收的,process.send()方法发送的消息是由child.on()方法接收的

参照这个例子我们就可以把第一个提供斐波纳契数据的服务进行改进,使每一个请求都有单独的一个新的进程来处理

var http = require('http');

var cp = require('child_process');

var server = http.createServer(function(req, res) {

    var child = cp.fork(__dirname + '/fibonacci-calc.js');//每个请求都单独生成一个新的子进程

    child.on('message', function(m) {

        res.end(m.result + '\n');

    });

    var input = parseInt(req.url.substring(1));

    child.send({input : input});

});

server.listen(8000);

fibonacci-calc.js

function fib(n) {

    if (n < 2) {

        return 1;

    } else {

        return fib(n - 2) + fib(n - 1);

    }

}

process.on('message', function(m) {

    process.send({result: fib(m.input)});

});

启动服务后,访问http://localhost:8080/9就可以计算出9的斐波纳契数列的值

以上就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
js动态加载以及确定加载完成的代码
Jul 31 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
Oct 27 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
Dec 27 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
jquery插件bxslider用法实例分析
Apr 16 Javascript
smartcrop.js智能图片裁剪库
Oct 14 Javascript
jQuery实现元素的插入
Feb 27 Javascript
详谈js原型继承的一些问题
Sep 06 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
vue-lazyload使用总结(推荐)
Nov 01 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
基于JS判断对象是否是数组
Jan 10 Javascript
jquery实现增加删除行的方法
Feb 03 #Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
Feb 03 #Javascript
director.js实现前端路由使用实例
Feb 03 #Javascript
js与jquery回车提交的方法
Feb 03 #Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 #Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 #Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 #Javascript
You might like
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
详解vue高级特性
2020/06/09 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
深入理解Django的自定义过滤器
2017/10/17 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
python中open函数的基本用法示例
2019/09/07 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
就业意向书范文
2014/04/01 职场文书
技术负责人任命书
2014/06/05 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers