美文网首页
nodejs——创建和控制外部进程

nodejs——创建和控制外部进程

作者: 含泪若笑 | 来源:发表于2018-01-25 16:37 被阅读198次

Node处理一个CPU密集的任务,可能会堵塞事件循环,因此降低了程序的响应。替代办法是,把CPU密集的任务分配给一个单独的进程来处理,从而释放事件循环。Node允许产生进程,并把这个新进程做为它父进程的子进程。在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程。另外一种需要使用子进程的情况是,执行一个外部命令,并让Node获取命令的返回值时。

当你需要执行一个外部shell命令或可执行文件时,你可以使用child_process模块,var child_process = require(‘child_process')。

用模块内的exec函数来执行外部命令,child_process.exec(command,options,function(err,stdout,stderr){});第一个参数是你准备执行的shell命令字符串,第二个可选参数,它包含一些配置选项,第三个参数是一个回调函数。回调中第二个参数stdout将会包含命令的标准输出,最后一个参数包含命令相关的错误输出。可选参数包括:cwd(当前目录)、encoding(编码格式)、timeout(超时时间ms)、maxBuffer(指定stdout流和stderr流允许输出的最大字节数,默认为200*1024)、killSignal(当超时或者输出缓存达到最大值时发送给子进程的终结信号。默认值是“SIGTERM”,当用SIGTERM信号时,进程接收到以后还可以进行处理或者重写信号处理器的默认行为。SIGKILL信号,它会被操作系统处理并强制立刻结束子进程)、evn(指定传递给子进程的环境变量,默认是null,即所有父进程的环境变量)。

子进程提供一组可扩展的父级环境变量的方法是创建一个新对象,复制process.env里的所有参数。

父线程向子线程传参的代码:exec('node child.js', {env: {number: 123}}, function(err, stdout, stderr) {}),子线程解析的方法:var number = process.env.number;子进程始终以字符串形式接收它。

使用child_process.spawn函数来创建一个新的子进程。var child = spawn('tail', ['-f', '/var/log/system.log']);tail -f 循环读取,tail命令将会监控/var/log/system.og文件。

监听子线程的输出数据:任何包含stdout属性的子进程句柄,都会将子进程的标准输出stdout作为一个流对象,你可以在这个流对象上绑定data事件,这样每当有数据块可用时,就会调用对应的回调函数,child.stdout.on(‘data',function(data){}。通过监听stderr流,父进程会在这种错误发生时得到通知。

发送数据到子线程:父进程还可以通过childPoces.stdin属性往子进程的标准输入里写入数据。process.stdin.resume();process.stdin.on('data', function(data) {//data加1}

父:var child = spawn('node', ['plus_one.js']);child.stdin.write(number + "n");child.stdout.once('data', function(data) {}

在子线程退出是获得通知:child.on('exit', function(code) {}(非0的退出码来代表某种失败状态),child.on('exit', function(code, signal) {}——如果子进程是被信号杀死而导致的非正常退出,那么相应的信号代码会被当作第二个参数传递给回调函数。

向进程发送信号并停止进程:信号是父进程用来跟子进程通信,甚至杀死子进程的一种简单方式。child.kill(‘SIGUSR2');或child.kill();子进程处理的方式:process.on('SIGUSR2', function() {}。

相关文章

  • nodejs——创建和控制外部进程

    Node处理一个CPU密集的任务,可能会堵塞事件循环,因此降低了程序的响应。替代办法是,把CPU密集的任务分配给一...

  • 线程的创建和控制

    线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 线程的控制 更多的API 创...

  • Linux内核及其功能

    管理进程:内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出),不同进程间通讯(通过信号,管道,或者...

  • IOC解析

    IOC概述 IOC: 控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护...

  • 【原创】学习NodeJs多进程(二)

    前文介绍了NodeJs子进程创建和进程间通信,但让开发者处理多进程的管理是比较麻烦的事情,通常开发者只希望关注业务...

  • IOC简介

    IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护 DI:依赖注...

  • 5. 进程管理

    NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程...

  • Spring IOC

    定义:控制反转,应用程序本身不需要创建和维护,由外部容器创建和维护。 实现方式:DI注入。(类似于dagger注入...

  • 1-3节linux系统编程

    进程创建和调度 1)进程 进程:程序的一次执行在操作系统中的影像进程控制块(PCB):对于操作系统来说,PCB即代...

  • 操作系统实验1:进程控制

    ●基本要求 模拟操作系统内核对进程的控制和管理:包括进程的创建和撤 销、进程状态的切换和简单的内存空间管理。 ●实...

网友评论

      本文标题:nodejs——创建和控制外部进程

      本文链接:https://www.haomeiwen.com/subject/rjxpaxtx.html