node js fork php,Node.js中execFile,spawn,exec和fork简介

Node.js中execFile,spawn,exec和fork简介

Node.js子流程child_process模块提供四种不同方法执行外部应用:

所有这些都是异步,调用这些方法会返回一个对象,这对象是ChildProcess类的实例。

1e60e70526bc1b7bcde5b67abe36763d.png

1. execFile

用于执行一个外部应用,应用退出后会返回一些可选蚕食和带有缓冲输出的callback。

child_process.execFile(file[, args][, options][, callback])

文件 将要执行外部应用的可执行文件的路径或名称

参数 是字符串数组

可选 

cwd  子流程当前工作目录

env  key-value环境值对

encoding  (默认: ‘utf8’)

timeout  (Default: 0)

maxBuffer  标准输入或输出的大量数据 (in bytes) – 如果超过子流程会被杀死 (Default:200\*1024)

killSignal  (Default: ‘SIGTERM’)

uid  流程的用户标识符 (See setuid(2).)

gid  流程的群组标识符(See setgid(2).)

当外部应用存在时,Node程序将携带参数"-version"被执行,当外部应用退出时,回调函数被调用,回调函数带有子流程的标准输入输出,来自外部应用的标准输出将被内部缓冲保存。

运行下面代码将打印当前node版本:

const execFile = require( 'child_process').execFile;

const child = execFile( 'node', [ '--version'], ( error, stdout, stderr) => {

if ( error) {

console.error( 'stderr', stderr);

throw error;

}

console.log( 'stdout', stdout);

});

node是如何发现外部应用?它是由PATH环境变量,其中会指定一系列目录,可执行的外部应用驻留在这些目录中,如果外部应该被发现存在,无需该外部应用的绝对路径或相对路径就会被定位。

execFile是当需要执行外部应用并获得输出时使用,我们能使用它运行一个图片处理应用将图片从PNG转为JPG格式,我们只关心其成功与否,当外部应用产生大量数据以及我们需要实时使用这些数据时,execFile就不要使用。

2.spawn

spawn 方法会在新的流程执行外部应用,返回I/O的一个流接口。

child_process.spawn(command[, args][, options])

使用案例:

const spawn = require( 'child_process').spawn;

const fs = require( 'fs');

function resize( req, resp) {

const args = [

"-", // use stdin

"-resize", "640x", // resize width to 640

"-resize", "x360

"-gravity", "center", // sets the offset to the center

"-crop", "640x360+0+0", // crop

"-" // output to stdout

];

const streamIn = fs.createReadStream( './path/to/an/image');

const proc = spawn( 'convert', args);

streamIn.pipe( proc.stdin);

proc.stdout.pipe( resp);

}

上面是一个express.js控制器函数中代码,我们使用流从一个图片文件读取,然后使用spawn方法生成convert程序,我们使用图片流喂给ChildProcess proc,只要这个proc对象产生数据,我们写入数据到一个可写的流中,用户无需等待整个图片转换完毕就能立即看见图片。

spawn返回一个对象流,对于输出大量数据然后需要读取的应用适合,因为是基于流,所有流好处有:

低内存损耗

自动处理后压back-pressure

在缓冲块中懒生产或消费数据

基于事件且非堵塞

缓冲可以让你超过V8 heap内存限制

3.exec

这个方法将会生成一个子shell,能够在shell中执行命令,并缓冲产生的数据,当子流程完成后回调函数将会被调用,可带有:

当命令成功执行,缓冲的数据

当命令失败,错误信息

child_process.exec(command[, options][, callback])

与execFile 和 spawn相比,exec并没有参数,因为exec允许我们在shell中执行多个命令,当使用exec时,我们如果需要传输参数到命令行,它们应该作为整个命令字符串的一部分。

下面代码将会输出当前目录下所有递归条目:

const exec = require( 'child_process').exec;

exec( 'for i in $( ls -LR ); do echo item: $i; done', ( e, stdout, stderr)=> {

if ( e instanceof Error) {

console.error( e);

throw e;

}

console.log( 'stdout ', stdout);

console.log( 'stderr ', stderr);

});

当在一个shell中运行命令,我们能实现在shell中所有功能,比如管道 重定向:

const exec = require( 'child_process').exec;

exec( 'netstat -aon | find "9000"', ( e, stdout, stderr)=> {

if ( e instanceof Error) {

console.error( e);

throw e;

}

console.log( 'stdout ', stdout);

console.log( 'stderr ', stderr);

});

上面案例中,node会生成一个子shell,并执行命令: netstat -aon | find “9000”

exec只有需要利用shell功能时才能使用。

4.fork

child_process.fork()方法是child_process.spawn()特殊情况,子流程返回一个ChildProcess对象,这个ChildProcess会有附加通讯通道,允许消息在父子之间来回穿梭。fork方法会打开一个IPC通道,允许Node流程之间传递消息:

如在子流程, process.on(‘message’) 和 process.send(‘message to parent’) 能被用来接受和发送数据

入在父流程, 使用child.on(‘message’) 和 child.send(‘message to child’)

每个流程都有自己的内存,都有它们自己的V8实例,启动至少30毫秒,每个大小是10mb

//parent.js

const cp = require( 'child_process');

const n = cp.fork( `${ __dirname }/sub.js`);

n.on( 'message', ( m) => {

console.log( 'PARENT got message:', m);

});

n.send({ hello: 'world' });

//sub.js

process.on( 'message', ( m) => {

console.log( 'CHILD got message:', m);

});

process.send({ foo: 'bar' });

因为Node主流程是单线程的,长期运行任务如计算等会堵塞主流程,因此,进来的请求不能被处理,应用变得不可响应,将这些长期运行任务放入主流程之外运行,fork一个新的node流程专门处理,这样主流程能够进行处理进来的请求保持可响应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云应用配置管理ACM发布,重新定义云上配置的存放方式

9月26日,阿里云宣布应用配置管理ACM产品正式商用,将重新定义云上配置的存放方式。 据了解,该产品具备亿级应用配置处理能力,将分布式架构下的应用配置管理智能化,极大的降低了在微服务、Devops、大数据等场景下配置管…

IDEA远程连接mysq数据库

#测试连接串 jdbc:mysql://localhost:3306/flowable-base?useUnicodetrue&characterEncodingutf8&zeroDateTimeBehaviorconvertToNull&useSSLtrue&serverTimezoneGMT%2B8

黑科技揭秘:网红“天空物联网飞艇”服务范围为何能突破30公里

2018杭州云栖大会的网红飞艇,搭载LoRaWAN网关,与地面网关一起组成上天入地的天空物联网服务,获得众多关注。其最主要的核心是Link WAN物联网络管理平台,提供了网关管理与设备快数接入云端,使得飞艇挂载网关十分容易。 …

雪花算法(snowflake) :分布式环境,生成全局唯一的订单号 | CSDN 博文精选

戳蓝字“CSDN云计算”关注我们哦!作者 | 琦彦 责编 | 阿秃转自 | CSDN 博客snowflake方案snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。这种方案大致来说是一种以划分命名空间(UUID也算,由于比较…

RabbitMQ+haproxy+keeplived 高可用负载均衡高可用镜像集群队列_01

文章目录一、RabbitMQ 集群节点说明二、服务器hosts文件统一修改三、RabbitMQ 镜像集群队列搭建部署一、RabbitMQ 集群节点说明 服务器IPhostname节点说明端口管控台地址账号密码192.168.0.115mq-01rabbitmq master5672http://192.168.0.115:15672guestguest192.168.0.117mq-0…

vue click事件_Vue.js---实现前后端分离架构中前端页面搭建(二)

【Vue.js实现前后端分离架构中前端页面搭建】九、Vue的事件处理Vue的事件都是使用 v-on:事件类型 进行绑定。也可以使用事件类型进行操作。其中事件类型和之前学习jQuery中事件名称是一样。示例中都是以点击事件为例。1. 直接操作属性值代码示例中通过点击按钮对counter值加一。…

边缘计算的五个大坑,里面一定有你跳过的

戳蓝字“CSDN云计算”关注我们哦!作者 | 砍柴网责编 | 阿秃在规模和增速方面,美国市场调研公司CB Insights估算,到2023年全球边缘计算行业,整体市场容量有望达到340亿美元。Technavio估计,从2018年到2022年&#xff0…

黑科技揭秘:眼科大夫如何应用5G+8K完成远程会诊?

秋季苹果新品发布会带来了iPhone迄今最大的显示屏,超视网膜显示屏比以往的iPhone屏幕更加清晰绚丽。随着影像技术的不断发展,多种多样的信息元素,通过一块块屏幕与我们交互,不管是手机手屏还是电视,不管是液晶还是OLED…

基于TableStore的物联网元数据管理

背景 常见的企业级无线接入方案有两种,分别被称作廋AP和胖AP。瘦AP(ACAP)架构为比较传统的企业级无线接入方案,主要优点就是漫游体验好,但是AC宕机的话会导致所属的AP全部无法工作。对于大型的办公场所,漫…

BDTC 2019 | 七个开发者能干多大的事?​

2015年,马云带领阿里巴巴集团的高管拜访了位于芬兰游戏公司supercell这家公司开发出了《部落战争》、《皇室战争》、《海岛奇兵》等App端知名游戏图片来自多玩BBS社区但是,这么知名的游戏公司开发团队当时却不足7人!整个团队好像cell一样&…

Mac 神兵利器(三) 使用Intellij IDEA打造全栈IDE

前言 作为一个开发者,包括职业与业余,相信大家都在使用集成开发环境IDE。作为专业的开发者,相信大家都是Full Stack Developer,意味着我们的日常开发通常都会涉及多种编程语言比如Java、Python、Shell、Golang、大前端等&#xf…

阿里云与MongoDB达成战略合作,成“唯一”;苹果将推出三款5G版iPhone;谷歌正式推出 TensorFlow 企业版……...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

RabbitMQ 镜像集群队列_集群高可用篇_03

文章目录一、普通集群搭建1. 停止 全部 MQ服务节点2. 文件(.erlang.cookie)同步3. 组成集群操作3. slave 加入集群操作4. 查看集群状态5. 访问管控台界面二、配置镜像队列2.1. 镜像队列思路2.2. 策略执行2.3. 登录管控台查看配置的策略信息一、普通集群搭建 1. 停止 全部 MQ服…

MaxCompute Tunnel上传典型问题场景

数据问题 Q:使用Tunnel Java SDK上传数据,上传数据可以自动分配到各个分区吗? A:目前Tunnel是无法自动上传数据并自动分配到各个分区的:每一次上传只支持数据上传到一张表或表的一个分区,有分区的表一定要…

开箱即用的安全方案:MaxCompute数据安全方案介绍

MaxCompute 是一个支持多租户的统一大数据处理平台,不同的用户对数据安全需求不尽相同。为了满足不同租户对数据安全的灵活需求,MaxCompute 支持项目空间级别的安全配置,ProjectOwner 可以定制适合自己的外部账号支持和鉴权模型并且在某种程度…

RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成负载均衡组件 Ha-Proxy_02

服务器IPhostname节点说明端口管控台地址账号密码192.168.0.115mq-01rabbitmq master5672http://192.168.0.115:15672guestguest192.168.0.117mq-02rabbitmq slave5672http://192.168.0.117:15672guestguest192.168.0.118mq-03rabbitmq slave5672http://192.168.0.118:15672gue…

腾讯云连续三年登上KVM开源贡献榜,引领KVM技术标准!

近日在KVM社区最为重要和权威的大会KVM Forum上,2019年全球企业对KVM的贡献排名正式对外公布,腾讯云凭借本年度40个patch的贡献名列全球第七,连续三年成为国内唯一登榜的云计算服务商。 对此腾讯云虚拟化资深研发专家李万鹏介绍,腾…

异构计算:软硬件结合全栈助力AI大爆发

9月20日上午,杭州云栖小镇E1-2会场,备受业界关注的2018年杭州云栖大会异构计算专场召开。 近年来,人工智能持续爆发,对算力提出了更高的要求。异构计算作为大计算时代的解决方案,意在打破传统通用计算的限制&#xff…

弹性计算平台技术:云服务器“安全”“稳定”“弹性”的基石

9月19日上午9点,杭州云栖小镇E1-3会场,2018年杭州云栖大会弹性计算平台技术专场拉开帷幕。 弹性计算系列产品是云时代的基石产品之一,一直备受外界关注。作为弹性计算团队在本届云栖大会的开场大戏,平台技术专场吸引了超过200位与…

RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成高性能高可用组件 Keepalived_03

服务器IPhostname节点说明端口管控台地址账号密码192.168.0.115mq-01rabbitmq master5672http://192.168.0.115:15672guestguest192.168.0.117mq-02rabbitmq slave5672http://192.168.0.117:15672guestguest192.168.0.118mq-03rabbitmq slave5672http://192.168.0.118:15672gue…