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过滤HTML标签以及空格的思路及代码
May 24 Javascript
巧用局部变量提升javascript性能
Feb 24 Javascript
jquery 设置style:display的方法
Jan 29 Javascript
用JavaScript实现对话框的教程
Jun 04 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
jquery if条件语句的写法
May 19 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 jQuery
Vue-router结合transition实现app前进后退动画切换效果的实例
Oct 11 Javascript
Vue如何实现监听组件原生事件
Jul 03 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
Jul 21 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
再论Javascript的类继承
2011/03/05 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
python os用法总结
2018/06/08 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
我们是伦敦女孩:WalG
2018/01/08 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
继承权公证书
2014/04/09 职场文书
初婚未育证明样本
2014/10/24 职场文书
2015年中秋节主持词
2015/07/30 职场文书
创业计划书之农家乐
2019/10/09 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis