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 客户端验证上传图片的大小(兼容IE和火狐)
Aug 15 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
Sep 02 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
js判断上传文件后缀名是否合法
Jan 28 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
JavaScript中split与join函数的进阶使用技巧
May 03 Javascript
jquery插件ContextMenu设置右键菜单
Mar 13 Javascript
详解一个小实例理解js原型和继承
Apr 24 Javascript
jquery操作select常见方法大全【7种情况】
May 28 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
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 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
javascript中的面向对象
2017/03/30 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
用Node提供静态文件服务的方法
2018/07/06 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
python实现udp数据报传输的方法
2014/09/26 Python
python实现按行切分文本文件的方法
2016/04/18 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
python next()和iter()函数原理解析
2020/02/07 Python
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
船舶专业个人求职信范文
2014/01/02 职场文书
英语系本科生求职信
2014/07/15 职场文书
学校远程教育工作总结
2015/08/11 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android