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中

  • 相关阅读:
    Netty与Spring Boot的整合
    Activiti 5.22.0 之自由驳回任务实现(亲测)
    学习机器学习前你应该要知道的一些事
    机器学习中调参的基本思想
    机器学习和深度学习区别的简要概述
    SKlearn中分类决策树的重要参数详解
    世界第二大软件国家如何看待人工智能、机器学习和大数据
    sklearn中的数据预处理和特征工程
    人工智能革命:人类永生还是灭亡(下)
    人工智能革命:人类永生还是灭亡(中)
  • 原文地址:https://www.cnblogs.com/fanghao/p/7818708.html
Copyright © 2011-2022 走看看