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 相关文章推荐
jQuery函数map()和each()介绍及异同点分析
Nov 08 Javascript
AngularJS语法详解
Jan 23 Javascript
JavaScript实现简单的二级导航菜单实例
Apr 15 Javascript
JavaScript获取两个数组交集的方法
Jun 09 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 jQuery
js实现的格式化数字和金额功能简单示例
Jul 30 Javascript
深入解读VUE中的异步渲染的实现
Jun 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 mssql 数据库分页SQL语句
2008/12/16 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python中的tcp示例详解
2018/12/09 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
职业女性的职业规划
2014/03/04 职场文书
秸秆管理实施方案
2014/03/15 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL