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的匿名函数小结
Dec 31 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
Jul 11 Javascript
jquery中对表单的基本操作代码
Jul 29 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Jun 05 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
Jun 16 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
ES2020 新特性(种草)
Jan 12 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 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类的使用 实例代码讲解
2009/12/28 PHP
PHP使用数组实现队列
2012/02/05 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
详解php中反射的应用
2016/03/15 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js 小数取整的函数
2010/05/10 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Python类属性的延迟计算
2016/10/22 Python
python实现统计代码行数的小工具
2019/09/19 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
自我鉴定的范文
2013/10/03 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
促销活动计划书
2014/05/02 职场文书
诚信贷款承诺书
2014/05/30 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
Win2008系统搭建DHCP服务器
2022/06/25 Servers