worker.js

var cluster = require('cluster')
function fibo(n) {
return n == 0 ? 0 : n > 1 ? fibo(n - 1) + fibo(n - 2) : 1
}
console.log(`worker ${cluster.worker.id} start...`)
process.on('message',msg=>{
console.log(` ${cluster.worker.id} receive data is ${msg}`)
var st = Date.now()
console.log(`worker ${cluster.worker.id} start to work`)
var result = fibo(msg)
console.log(`worker ${cluster.worker.id} finish work and using ${Date.now() - st} ms`)
process.send(result)
})

master.js

module.exports = exuteFibo

function exuteFibo() {
return (new Promise((reslove, reject) => {
var cluster = require('cluster')
const numCpus = require('os').cpus().length
var result = []
var workerID = []
cluster.setupMaster({
exec: '../worker.js',
slient: true
})
if (cluster.isMaster) {
var collection = [41, 41, 41, 41]
var st = Date.now()
for (let i = 0; i < numCpus; i++) {
var wk = cluster.fork()
workerID.push(wk.id)
wk.send(collection[i])
}
cluster.on('fork', worker => {
if (workerID.includes(worker.id)) {
console.log(`[master]: fork worker ${worker.id}`)
}
})
cluster.on('exit', (worker, code, signal) => {
console.log(`[master]:worker ${worker.id} died`)
})
var numCount = 0
Object.keys(cluster.workers).forEach(id => {
cluster.workers[id].on('message', msg => {
console.log(`[master] receive message from [worker ${id}]:${msg}`)
result.push(msg)
numCount++
if (numCount == collection.length) {
console.log(`master finish all work adn using ${Date.now() - st} ms`)
workerID.forEach(function(id) {
if (!cluster.workers[id].exitedAfterDisconnect) {
cluster.workers[id].disconnect();
}
})
reslove(result)
}
})
})
}
}))
}

testMaster.js

var exuteFibo = require('./masterFinal.js')
console.log('====start=======')
var st = Date.now()

exuteFibo().then(rs => {
console.log(`Finish all work and using ${Date.now()-st}`)
console.log('####Get result from multipe-processes:' + rs)
})

st = Date.now()

exuteFibo().then(rs => {
console.log(`Finish all work and using ${Date.now()-st}`)
console.log('####Get result from multipe-processes:' + rs)
})

运行结果:

====start=======

[master]: fork worker 1

[master]: fork worker 2

[master]: fork worker 3

[master]: fork worker 4

[master]: fork worker 5

[master]: fork worker 6

[master]: fork worker 7

[master]: fork worker 8

worker 4 start...

worker 1 start...

4 receive data is 41

worker 4 start to work

worker 2 start...

worker 3 start...

1 receive data is 41

worker 1 start to work

2 receive data is 41

worker 2 start to work

worker 5 start...

5 receive data is 41

worker 5 start to work

3 receive data is 41

worker 3 start to work

worker 6 start...

6 receive data is 41

worker 6 start to work

worker 7 start...

7 receive data is 41

worker 7 start to work

worker 8 start...

8 receive data is 41

worker 8 start to work

worker 4 finish work and using 9574 ms

[master] receive message from [worker 4]:165580141

[master] receive message from [worker 4]:165580141

worker 7 finish work and using 9519 ms

[master] receive message from [worker 7]:165580141

worker 6 finish work and using 9652 ms

[master] receive message from [worker 6]:165580141

worker 1 finish work and using 9732 ms

[master] receive message from [worker 1]:165580141

[master] receive message from [worker 1]:165580141

master finish all work adn using 9956 ms

Finish all work and using 9957

####Get result from multipe-processes:165580141,165580141,165580141,165580141

[master]:worker 6 died

[master]:worker 6 died

[master]:worker 7 died

[master]:worker 7 died

worker 2 finish work and using 9778 ms

[master] receive message from [worker 2]:165580141

[master] receive message from [worker 2]:165580141

worker 5 finish work and using 9780 ms

[master] receive message from [worker 5]:165580141

[master]:worker 5 died

[master]:worker 5 died

worker 3 finish work and using 9798 ms

[master] receive message from [worker 3]:165580141

master finish all work adn using 10044 ms

[master] receive message from [worker 3]:165580141

Finish all work and using 10033

####Get result from multipe-processes:165580141,165580141,165580141,165580141

[master]:worker 4 died

[master]:worker 4 died

[master]:worker 1 died

[master]:worker 1 died

[master]:worker 2 died

[master]:worker 2 died

[master]:worker 3 died

[master]:worker 3 died

worker 8 finish work and using 9192 ms

[master] receive message from [worker 8]:165580141

[master]:worker 8 died

[master]:worker 8 died

node cluster模块,仿多线程并发调用,的更多相关文章

  1. node cluster模块的使用和测试

    首先安装async包 用到的有http.cluster包 http和cluster都会node自带的包,无需安装 1:创建cluster.js,代码如下,更具cpu创建多个进程 var cluster ...

  2. Python Socket多线程并发

    1.SocketServer模块编写的TCP服务器端代码 Socketserver原理图 服务端: import SocketServer #导入SocketServer,多线程并发由此类实现 cla ...

  3. Java并发编程 (十) 多线程并发拓展

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种 ...

  4. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    [摘要] 集群管理模块cluster浅析 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 概述 cluster模块是node.js中用于实现和管理 ...

  5. 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)

    目录 一. 概述 二. 线程与进程 三. cluster模块源码解析 3.1 起步 3.2 入口 3.3 主进程模块master.js 3.4 子进程模块child.js 四. 小结 示例代码托管在: ...

  6. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    [摘要] cluster模块详解 示例代码托管在:http://www.github.com/dashnowords/blogs 阅读本章需要先阅读本系列前两章内容预热一下. 一. 引言 前两篇博文中 ...

  7. 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)

    目录 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨进程通讯工具方法Utils 五.act:queryServer消息 六.轮询调度Roun ...

  8. Node.js的cluster模块——Web后端多进程服务

    众所周知,Node.js是单线程的,一个单独的Node.js进程无法充分利用多核.Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机 ...

  9. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

随机推荐

  1. ajax对象方法的使用

    change.js文件的内容对象函数关键字:fnjQuery.fn.change = function () { this.css({"background": "red ...

  2. 如何使用VisualSVN Server建立版本库

    首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要建立版本库,需要右键单击左边窗口的Repositores, ...

  3. hive和hbase比较(整理)

    hive1.可以理解为一种SQL执行引擎,对SQL的支持最终转换为map/reduce任务2.不支持更新.删除操作,但可以插入3.任务不是实时执行,用时一般为数分钟到数小时4.本身可以不存储数据,只存 ...

  4. LeetCode高频148错题记录

    3. Max Points on a Line 共线点个数3种解法 思路一:思考如何确定一条直线,两点法,确定斜率后带入一点.有三种情况,1. 两点重合,2. 斜率不存在,3. 正常算,依次以每个点为 ...

  5. raspberry pi恢复jessie镜像之后

    1.更新源 nano /etc/apt/source.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib ...

  6. Python学习(六) —— 函数

    一.函数的定义和调用 为什么要用函数:例如,计算一个数据的长度,可以用一段代码实现,每次需要计算数据的长度都可以用这段代码,如果是一段代码,可读性差,重复代码多: 但是如果把这段代码封装成一个函数,用 ...

  7. log4j.xml 报告集成

    等级: trace< debug<info<warn<error<fatal trace 追踪 deug: eclipse, Log4j配置   [1]从零开始 a). ...

  8. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  9. js去掉前后空格

    //去前后空格 data=data.replace(/(^\s*)|(\s*$)/g, "");

  10. Machine Learning 神器 - sklearn

    Sklearn 官网提供了一个流程图, 蓝色圆圈内是判断条件,绿色方框内是可以选择的算法: 从 START 开始,首先看数据的样本是否 >50,小于则需要收集更多的数据. 由图中,可以看到算法有 ...