前端架构师-week4-Node多进程开发入门

news2024/11/28 12:22:22

目录

学习路径

官方文档

什么是进程

child_process 用法

exec & execFile 用法

spawn 用法以及与exec & execFile的区别

fork用法及父子进程通信机制讲解 

child_process同步方法使用教程


学习路径

官方文档

中文版:http://nodejs.cn/api/child_process.html

什么是进程

进程 Process 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

进程的概念主要有两点:

·第一:进程是一个实体。每一个进程都有它自己的地址空间。

·第二:进程是一个“执行中的程序”,存在嵌套关系。

node多进程核心其实就是创建一个子进程,这个子进程会依附在当前node进程下面。node多进程开发中核心应用的类是child_process内置库。我们在child_process中创建的进程就是Node.js的子进程。

ps -ef 把所有当前操作系统中的进程全部打开

| grep node 筛选node进程

| grep 26309 筛选26309进程

UID 当前用户获得权限的ID

PID 进程ID

PPID 父进程ID

/sbin/launchd 桌面应用程序 PID为 1

child_process 用法

异步: 

        exec 执行shell脚本,和普通命令相比 可以是一个连续的语句

        execFile 执行一个文件,可传入 命令入参['xx']

        fork

        spawn

同步:

        execSync 简单命令通常会使用。可能会拼接进风险命令。

        execFileSync 安全角度考虑比execSync好点

        spawnSync 会返回一个对象

小知识点:

        path.resolve() 中使用相对路径 ./ ,效果是相对命令执行的路径(在哪个目录下执行的命令)。用__dirname,效果是代码文件所在的路径。path.resolve() 会注入两个全局变量__filename、__dirname。

        chmod +x bin/process/test.shell 给文件加个可执行权限

exec & execFile 用法

const cp = require('child_process')
const path = require('path')

cp.exec(path.resolve(__dirname, 'test.shell'), {
    cwd: path.resolve('..'), //在此路径下执行命令
    timeout: 0
}, function(err, stdout, stderr) {
    console.log(err),
    console.log(stdout),
    console.log(stderr)
})

cp.execFile(path.resolve(__dirname, 'test.shell'), ['-al', '-bl'], function(err, stdout, stderr) {
    console.log(err),
    console.log(stdout),
    console.log(stderr)
})
# test.shell 文件内容

ls -al

echo $1
echo $2

spawn 用法以及与exec & execFile的区别

const child = cp.spawn(path.resolve(__dirname, 'test.shell'), ['-al','-bl'], {
    cwd: path.resolve('..')
})
console.log(child.pid, process.pid)

child.stdout.on('data', function(chunk) {
    console.log(chunk.toString())
})
//会输出:-al -bl

child.stderr.on('data', function(chunk) {
    console.log(chunk.toString())
})
//会输出:lss: command not found

spawn 通过一种流的方式,不断地接受进程传来的执行结果,并且可以对它进行打印。

spawn:适合耗时任务(比如:npm install),需要不断日志。

const child = cp.spawn('cnpm', ['install'], {
    cwd: path.resolve('/Users/sam/Desktop/vue-test/imooc-test-lib')
})
child.stdout.on('data', function(chunk) {
    console.log(chunk.toString())
})
child.stderr.on('data', function(chunk) {
    console.log(chunk.toString())
})

exec / execFile:适合开销比较小的任务,没有一次一行日志,只有最终一起返回日志。

cp.exec('npm install', {
    cwd: path.resolve('/Users/sam/Desktop/vue-test/imooc-test-lib')
}, function(err, stdout, stderr) {
    console.log(err),
    console.log(stdout),
    console.log(stderr)
})

原理:/usr/bin/env npm 先去找npm文件,找到之后再去执行install。

fork用法及父子进程通信机制讲解 

用来创建子进程,使用node进行执行

// child.js 文件内容

console.log('child process')
console.log('child pid', process.pid)

process.on('message', (msg) => {
  console.log(msg);
});
process.send('hello main process');
// fork: Node(main) -> Node(child)
const child = cp.fork(path.resolve(__dirname, 'child.js'))
child.send('hello child process!', () => {
  //child.disconnect();  // 断开,否则两边会处于等待的状态,等待对方向我发送信息。
});
child.on('message', (msg) => {
  console.log(msg);
});
console.log('main pid:', process.pid)

// 会打印
// main pid: 28236
// child process
// child pid: 28237
// hello child process!
// hello main process

// fork 本质上也是调用了 spawn,spawn会创建一个子进程对象。
// 通过child可以实现主进程与子进程之间的通信。
// fork 是异步的。类似于require。注意代码执行顺序。

fork应用场景:

        比较耗时的操作,而且耗时操作是通过nodejs实现的,比如下载文件。下载文件时可以不断地向主进程中传递消息。甚至通过fork可以实现多进程下载的功能。

child_process同步方法使用教程

......

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

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

相关文章

Flutter 如何将代码显示到界面上

前言 如何优雅的将项目中的代码,亦或是你的demo代码展示到界面上?本文对使用简单、便于维护且通用的解决方案,进行相关的对比和探究 为了节省大家的时间,把最终解决方案的相关接入和用法写在前面 预览代码 快速开始 接入&…

C. Permutation Game(博弈 + 拓扑的思想)

Problem - C - Codeforces 经过漫长的一天, Aice和Bob决定玩一个小游戏。游戏棋盘由n个格子组成,在一条直线上,编号从1到n,每个格子包含一个数字4;,qy在1到n.之间,而且没有两个格子包含相同的数字。 一个棋子被放在其中一个格子里…

nestJS入门cli 创建项目以及集成swagger和mysql

nestJs 1. 简介 介绍 NestJS NestJS 是一个基于 TypeScript 的渐进式 Node.js 框架,它结合了 OOP、FP 和 FRP 的元素,以提供一种现代且可扩展的开发体验。NestJS 建立在 Express.js 之上,但是提供了更加抽象和模块化的方式来编写应用程序。…

蓝牙资讯|苹果与谷歌起草蓝牙定位追踪设备行业规范

苹果与谷歌于当地时间5月2日联合提交了一份行业规范草案,以帮助应对蓝牙定位追踪设备遭滥用的问题。目前已有包括三星在内的追踪设备制造厂商宣布支持该草案。 据了解,苹果与谷歌此次联合提交的行业规范草案将云熙蓝牙定位追踪设备兼容跨iOS以及Android平…

【LeetCode: 518. 零钱兑换 II | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

十五周算法训练营——二叉搜索树(BST)

今天是十五周算法训练营的第五周,主要讲二叉搜索树专题,包含:验证二叉搜索树、不同的二叉搜索树、二叉树的最近公共祖先、二叉搜索树的最近公共祖先。(欢迎加入十五周算法训练营,与小伙伴一起卷算法) BST的…

在SQL中使用AI【EVA】

EVA 旨在支持使用深度学习模型对结构化数据(表格、特征向量)和非结构化数据(视频、播客、PDF 等)进行操作的数据库应用程序。 它使用一系列受久经考验的关系数据库系统启发的优化,包括函数缓存、采样和基于成本的谓词重…

mybatisPlus初识

文章目录 什么是mybatisplus依赖入门案例自动填充乐观锁悲观锁乐观锁 mybatisPlus实现乐观锁批量查询根据指定条件查询 什么是mybatisplus mybatisplus是mybatis的增强工具&#xff0c;支持多种类型的数据库。 依赖 <dependency><groupId>com.baomidou</group…

我的服务器被挖矿了,原因竟是。。。

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 挖矿木马应急响应 一、什么是挖矿二、被挖矿主机现象三、挖矿木马处置思路1&#xff09;隔…

Git 使用教程:最详细、最正宗手把手教学(万字长文)

目录 一&#xff1a;Git二&#xff1a;SVN与Git的的区别三、安装Git四&#xff1a;常规操作五&#xff1a;远程仓库六&#xff1a;创建与合并分支七&#xff1a;bug分支八&#xff1a;多人协作九&#xff1a;git可视化工具 Git Git 是一种分布式版本控制系统&#xff0c;用于…

搭建免费的Plex媒体服务器 - 打造超级多媒体中心【异地远程连接】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

科普, API 是这么演变而来的

API&#xff0c;全称为 Application Programming Interface&#xff0c;中文翻译为应用程序编程接口&#xff0c;是为了方便应用程序之间的数据和功能交互而设计的一些标准方法。API 的使用让开发者能够快速、高效地构建应用程序&#xff0c;从而加速了应用程序的开发速度。在 …

第二章物理层

1.物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流。物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本层的协议和服务&#xff0c;而不必考虑网络具体的传输媒体是什么。 物理层协议的主要任务 机…

21.ThreadLocal有哪些内存泄漏问题?如何避免?

ThreadLocal有以下几个内存泄漏问题&#xff1a; 长期不清理&#xff1a;如果ThreadLocal对象被长期占用&#xff0c;且不及时清理&#xff0c;会导致内存泄漏&#xff1b;使用static ThreadLocal&#xff1a;如果将ThreadLocal定义为static变量&#xff0c;就会导致它的生命周…

Java程序设计-案例:自由落体

程序模拟物体从10000米高空掉落后的反弹行为。 球体每落地一次&#xff0c;就会反弹至原高度的一半。按用户输入的弹跳次数&#xff0c;计算球体每次弹跳的高度。 实现过程&#xff1a; 1. 新建项目&#xff1b; 2. 接收 用户输入的弹跳次数&#xff1a; &#xff08;1&#…

全国快递物流 API 实现快递单号自动识别的原理解析

概述 全国快递物流 API 是一种提供快递物流单号查询的接口&#xff0c;涵盖了包括申通、顺丰、圆通、韵达、中通、汇通等600快递公司的数据。该 API 的目标是为快递公司、电商、物流平台等提供便捷、快速、准确的快递物流信息查询服务。 数据采集和处理 全国快递物流 API 的…

[深度学习]Ring All-reduce的数学性质

分布式深度学习里的通信严重依赖于规则的集群通信诸如 all-reduce, reduce-scatter, all-gather 等&#xff0c;因此&#xff0c;实现高度优化的集群通信&#xff0c;以及根据任务特点和通信拓扑选择合适的集群通信算法至关重要。 本文以数据并行经常使用的 all-reduce 为例来…

PCIe物理层链路训练和初始化(详细)总结附图文解析-PCIe专题知识(三)

目录 前言一、简介1.1 链路过程总结 二、基本概念2.1 常用字符序列2.1.1 TS1 TS2序列2.1.2 Idle序列2.1.3 FTS(Fast training sequence)序列2.1.4 SKIP序列 2.2 链路训练相关知识 三、具体过程3.1 detect状态3.2 polling状态3.3 config状态3.4 L0状态3.5 Recovery状态3.5.1 Rec…

【Git】全面详细了解开发者必备工具Git(2.0)

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 学习目标起步——关于版本的控制  文件的版本  版本控制软件  使用版本控制软件的好…

Ubuntu 23.04 安装 Conda

Ubuntu 23.04 安装 Conda 1. 下载 Conda 安装脚本2. 运行安装脚本3. 安装完成后&#xff0c;关闭当前终端并打开新终端&#xff0c;这将激活 Conda4. 更新 Conda 至最新版本5. 添加必要的 Conda 通道以获取更多软件包6. 测试是否安装成功 1. 下载 Conda 安装脚本 wget https:/…