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也算,由于比较…

python3生成二维码实例fromm_Python使用mqtt极简例子

mqtt简介一种数据传输协议,不怎么耗资源,适合物联网远程传数据。比如一个传感器要发数据给电脑,那么需要开一个mqtt服务器(Broker),然后传感器作为客户端(client)通过mqtt服务器发布(publish)某个主题(topic)的消息(message)&…

oracle imp 包,oracle imp

exp/imp命令以及commity参数1、导出确认ORACLE_SID正确需要sysem用户,可以不用grant execute flashback to user,system密码******export ORACLE_SID***(无单机多实例的无需做)exp system/****** tables...文章技术小阿哥2017-11-27923浏览量ORACLE exp/…

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…

ora-07445 oracle 9,Oracle ORA-07445 : 出现异常错误: 核心转储(一)

ORA-07445: exception encountered: core dump [kghalp()58] [SIGSEGV] [Address not mapped to object] [0x000000068] [] []DUMP文件*** SERVICE NAME:(orcl) 2012-07-12 14:18:55.016*** SESSION ID:(258.58198) 2012-07-12 14:18:55.016Exception signal: 11 (SIGSEGV), co…

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

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

RabbitMQ 下载安装配置_集群高可用篇_02

文章目录1. 在线yum安装环境依赖2. 在线下载软件3. rpm安装软件4. 修改集群用户与连接心跳检测5. 启动rabbitmq6. 查看rabbitmq启动状态7. 安装管理插件8. 关闭防火墙9. 浏览器访问验证在3台mq服务器上分别操作如下: 这也是单机安装流程,只不过在3台机器…

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

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

python treeview文本自动换行显示_在tkinter.ttk.Treeview列中设置文本格式

我想知道如何调整ttk.Treeview列中的文本。下面是我的意思的一个例子。请注意日期和数字之间的位置不正确。我认为这和间距有关,但我可能错了。编辑:用Python 3编写。#! codingutf-8import pickleimport matplotlib.pyplot as pltimport tkinter as tkfr…

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

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

oracle导入导出版本规则,oracle expdp impdp 导出导入(支持高版本到低版本)

在plsql或sqlplus中创建目录:create or replace directory dmp11g as /home/oracle/dmps3;grant read,write on directory dmp11g to system;导出语句示例:expdp system/oracleip:1521/dbname directorydmp11g logfilexxx.log dumpfilexxx_%U.dmp parall…

服务器ip映射修改_集群高可用篇_01

分别修改5台服务器的hosts文件 vim /etc/hosts添加ip 映射 192.168.0.115 mq-01 192.168.0.117 mq-02 192.168.0.118 mq-03 192.168.0.119 hk-01 192.168.0.120 hk-02重新启动服务器 reboot

基于TableStore的海量电商订单元数据管理

一、背景 订单系统存在于各行各业,如电商订单、银行流水、运营商话费账单等,是一个非常广泛、通用的系统。对于这类系统,在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展,以及各企业对数据的重视,需要…

python 文件上传 web_pythonweb自动化三种文件上传方法

文件上传三种方式:(一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传方法:和用户输入是一样的,使用send_keys步骤:1、找到定位元素,2,输入文件路径eledriver.fi…

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

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