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中

  • 相关阅读:
    python数字
    python字符串方法
    python操作符与流程控制
    网络基础和python(二)
    网络基础和python
    Ubuntu源更新
    make和makefile介绍
    JavaScript
    redis mac安装配置
    网络编程之socket(TCP,UDP)
  • 原文地址:https://www.cnblogs.com/fanghao/p/7818708.html
Copyright © 2011-2022 走看看