zoukankan      html  css  js  c++  java
  • NodeJS多进程

    NodeJS多进程

    Node以单线程的方式运行,通过事件驱动的方式来减少开销车,处理并发。我们可以注册多进程,然后监听子进程的事件来实现并发

    简介

    Node提供了child_process模块来处理子进程,有三种形式

    • exec:直接在terminal里面开启进程
    • spawn:指定命令+参数
    • fork:与spawn类似,默认node执行,并且父子间建立通信管道,可以实现进程间通信

    exec

    slave.js

    var f = function(){
        // process全局可以获得当前进程的信息
        console.log("进程", process.argv[2] + "执行结束")
    }
    // 延迟运行,现node的注册机制和并发
    setTimeout(f, 1000*(3-process.argv[2]));
    

    master.js

    const child_process = require('child_process')
    
    for (var id = 0; id<3; id++){
        // 开启子进程,并处理输出
        var subProcess = child_process.exec('node slave.js '+id,function (error, stdout, stderr) {
            if (error){
                console.error(error)
            }
            else{
                console.log('stdout: '+stdout)
                console.log('stderr: '+stderr)
            }
        })
        // 监听三个进程
        subProcess.on('exit',function (code) {
            console.log("子进程已经退出 "+code) //打印退出码
        })
    }
    
    子进程已经退出 0
    stdout: 进程 2执行
    
    stderr: 
    子进程已经退出 0
    stdout: 进程 1执行
    
    stderr: 
    子进程已经退出 0
    stdout: 进程 0执行
    
    stderr: 
    

    spawn

    const child_process = require('child_process')
    
    for (var id = 0; id<3; id++){
        // 开启子进程,并处理输出,这种传参方式更加规整一些
        var subProcess = child_process.spawn('node', ['slave.js', id])
        // 监听流
        subProcess.stdout.on('data',function (data) {
            console.log('stdout: '+data)
        })
    
        subProcess.stderr.on('data',function (data) {
            console.log('stderr: '+data)
        })
    
        // 监听三个进程
        subProcess.on('exit',function (code) {
            console.log("子进程已经退出 "+code) //打印退出码
        })
    }
    

    运算结果与exec版本一致

    fork

    const child_process = require('child_process')
    
    for (var id = 0; id<3; id++){
        // 开启子进程,并处理输出
        var subProcess = child_process.fork('slave.js', [id])
        // 监听三个进程
        subProcess.on('exit',function (code) {
            console.log("子进程已经退出 "+code) //打印退出码
        })
    }
    

    运算结果

    进程 2执行结束
    子进程已经退出 0
    进程 1执行结束
    子进程已经退出 0
    进程 0执行结束
    子进程已经退出 0
    

    值得注意的是,fork的子进程输出内容输出在父进程的同一个terminal中

  • 相关阅读:
    《瓦尔登湖》读书随笔
    Ubuntu下nginx+uwsgi+flask的执行环境搭建
    Android studio SweetAlert for Android
    mysql 主从不同步处理--数据库初始化
    Nginx学习——http配置项解析编程
    支付宝集分宝接口开发的相关问题解答
    解读刘强东关于人才的两个标准和5个层次
    oc35--自定义构造方法
    oc34--instancetype和id的区别
    oc33--构造方法2
  • 原文地址:https://www.cnblogs.com/fanghao/p/7818708.html
Copyright © 2011-2022 走看看