zoukankan      html  css  js  c++  java
  • node cluster模块,仿多线程并发调用,

    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

  • 相关阅读:
    Linux下修改Apache即httpd的端口
    jenkins.JenkinsException: Error in request. Possibly authentication failed
    jenkins-python 获取正在运行的Job
    通过python-jenkins 获取job的输出日志
    电子公文传输系统团队项目
    接口重复请求报错问题排查
    创建couchbase的bucket 提示RAM不够用 all the ram in the cluster is already allocated to existing bucekets,delete some buckets,,
    tornado重定向的几种方式
    tornado进行登录案例
    tornado设置cookie和查看cookie,含加密
  • 原文地址:https://www.cnblogs.com/qiyc/p/9379148.html
Copyright © 2011-2022 走看看