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 相关文章推荐
如何简单地用YUI做JavaScript动画
Mar 10 Javascript
ext读取两种结构的xml的代码
Nov 05 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
jQuery防止重复绑定事件的解决方法
May 14 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
5种JavaScript脚本加载的方式
Jan 16 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
Vuejs中使用markdown服务器端渲染的示例
Nov 22 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
Apr 29 Javascript
Vue可自定义tab组件用法实例
Oct 24 Javascript
vue远程加载sfc组件思路详解
Dec 25 Javascript
js实现微信聊天效果
Aug 09 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文件夹与文件目录操作函数介绍
2013/09/09 PHP
php简单日历函数
2015/10/28 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
JavaScript的目的分析
2007/01/05 Javascript
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
JS实现纸牌发牌动画
2021/01/19 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
远程调用的原理
2014/07/05 面试题
保险经纪人求职信
2014/03/11 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
工程项目合作意向书
2015/05/08 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL