• 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

  • 相关阅读:
    c++ 与 c 的区别
    c++ 查看程序运行时间
    串口阻塞与非阻塞
    串口缓冲区
    马拉车算法
    printf 自加自减
    stack
    长度问题
    PCIE的内存地址空间、I/O地址空间和配置地址空间
    数组和指针
  • 原文地址:https://www.cnblogs.com/qiyc/p/9379148.html
Copyright © 2020-2023  润新知