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 相关文章推荐
JavaScript高级程序设计 事件学习笔记
Sep 10 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
javascript每日必学之循环
Feb 19 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
利用jQuery对无序列表排序的简单方法
Oct 16 Javascript
微信小程序 教程之模块化
Oct 17 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
Jan 17 Javascript
javascript按顺序加载运行js方法
Dec 01 Javascript
JS中常用的消息框总结
Feb 24 Javascript
vue实现固定位置显示功能
May 30 Javascript
解决layui调用自定义方法提示未定义的问题
Sep 14 Javascript
原生JavaScript实现随机点名表
Jan 14 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
第十四节--命名空间
2006/11/16 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
pyenv命令管理多个Python版本
2017/03/26 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
Python with语句用法原理详解
2020/07/03 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
求职简历自我评价范例
2014/03/12 职场文书
党员教师工作决心书
2014/03/13 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
springboot读取nacos配置文件
2022/05/20 Java/Android