探索5 大 Node.js 功能
目录
单线程 Node.js
工作线程【Worker Threads】
Node.js 进程
进程缺点
工作线程
注意
集群进程模块【Cluster Process Module】
内部发生了什么?
为什么要使用集群
注意:
应用场景:
内置 HTTP/2 支持
这个 HTTP/2 是什么?
Node.js 如何提供对 HTTP/2 的支持?
开始使用 http2
流【Streams API】
什么是流
为什么要使用 Streams?
开始使用 Streams
结论
REPL (Read-Eval-Print Loop)
介绍
命令行快捷键
结论
结论
单线程的 Node.js
首先我们要知道Node.js 以其单线程架构而闻名。
最初,Node.js 是为 I/O 密集型任务(如 Web 服务器)而设计的。对于这些任务,创建多个线程会增加管理线程同步和上下文切换的开销和复杂性。相反,Node.js 采用了事件驱动的方法。
这种行为给 Node.js 带来了一些优点,但也有局限性。
优点还行。但是局限性呢?
Node.js 单线程事件循环带来的主要限制如下,
CPU 密集型任务可能会阻塞循环:大量计算可能会“冻结”循环,从而影响其他请求的响应能力。
没有真正的并行:任务仍然一个接一个地执行,而不是同时执行。
为了解决这些限制,Node.js在各个 Node.js 版本中引入了工作线程和集群模块。
工作线程【Worker Threads】
Node.js 进程
当 Node.js 进程启动时,它会运行:
- 一个进程:进程是一个全局对象,可以在任何地方访问,并且包含有关当前正在执行的操作的信息。
- 一个线程:单线程意味着在给定的进程中一次只执行一组指令。
- 一个事件循环:这是了解 Node 最重要的方面之一。尽管 JavaScript 是单线程的,但它却允许 Node 异步并具有非阻塞 I/O,方法是通过回调、承诺和 async/await 尽可能将操作卸载到系统内核。
- 一个 JS 引擎实例:这是一个执行 JavaScript 代码的计算机程序。
- 一个 Node.js 实例:执行 Node.js 代码的计算机程序。
换句话说,Node 在单线程上运行,事件循环中一次只发生一个进程。一个代码,一次执行(代码不是并行执行的)。这非常有用,因为它简化了使用 JavaScript 的方式,而不必担心并发问题。
采用这种方法构建的原因是 JavaScript 最初是为客户端交互(如网页交互或表单验证)创建的——不需要多线程的复杂性。
进程缺点
但是,它也存在缺点:如果代码占用大量 CPU,例如在内存中进行大型数据集的复杂计算,它可能会阻止其他进程的执行。同样,如果向包含占用大量 CPU 的代码的服务器发出请求,该代码可能会阻塞事件循环并阻止处理其他请求。
如果主事件循环必须等待直到执行完下一个命令,则该函数被视为“阻塞”。 “非阻塞”函数将允许主事件循环在开始时立即继续,并且通常在主循环完成后通过调用“回调”来提醒主循环。
黄金法则:不要阻塞事件循环,尽量保持其运行,并注意避免任何可能阻塞线程的事情,如同步网络调用或无限循环。
工作线程
对于CPU性能最好的解决方案就是Worker Threads
工作线程具有:
- 一个流程
- 多线程
- 每个线程一个事件循环
- 每个线程一个 JS 引擎实例
- 每个线程一个 Node.js 实例
工作线程可以:
- 卸载 CPU 密集型任务:释放主线程以执行其他工作。
- 实现并行:并发执行任务以获得更快的性能。
- 高效共享数据:避免在进程之间复制数据的开销。
工作线程的特殊之处:
- ArrayBuffers将内存从一个线程转移到另一个线程
- SharedArrayBuffer可以从任一线程访问。它允许在线程之间共享内存(仅限于二进制数据)。
- Atomics可用,它允许更高效地同时执行一些进程,并允许在 JavaScript 中实现条件变量
- MessagePort,用于不同线程之间的通信。可用于在不同的Worker之间传输结构化数据、内存区域和其他MessagePort。
- MessageChannel表示用于不同线程之间通信的异步、双向通信通道。
- WorkerData用于传递启动数据。一个任意的 JavaScript 值,其中包含传递给此线程的 Worker 构造函数的数据的克隆。数据的克隆方式与使用postMessage()
API
- const { worker, parentPort } = require(‘worker_threads’)=>worker该类代表一个独立的 JavaScript 执行线程,是parentPort消息端口的一个实例
- new Worker(filename)或new Worker(code, { eval: true })=> 是启动 worker 的两种主要方式(传递文件名或要执行的代码)。建议在生产中使用文件名。
- worker.on(‘message’),worker/postMessage(data)=> 用于监听消息并在不同的线程之间发送消息。
- parentPort.on(‘message’), parentPort.postMessage(data)=> 使用 发送的消息parentPort.postMessage()将在使用 的父线程中可用worker.on('message'),并且使用 从父线程发送的消息worker.postMessage()将在使用 的本线程中可用parentPort.on('message')。
例子
const { Worker } = require('worker_threads');const worker = new Worker(`
const { parentPort } = require('worker_threads');
parentPort.once('message',message => parentPort.postMessage({ pong: message }));
`, { eval: true });
worker.on('message', message => console.log(message));
worker.postMessage('ping');
$ node --experimental-worker test.js
{ pong: ‘ping’ }
注意
- 工作线程共享内存
- 创建和管理工作线程会产生一些开销,因此请考虑其针对特定用例的益处与成本。
- 线程安全至关重要!使用同步机制来确保数据完整性。
- 工作线程增加了复杂性,因此请明智地将它们用于真正受益于并行性的任务。
集群进程模块【Cluster Process Module】
该cluster模块可分散 Node.js 应用程序的工作负载,充分利用计算机(服务器)的全部处理能力。例如,如果我们有一个 8 核处理器,那么我们的工作就不必只集中在一个核心上,而是可以分散到所有八个核心上。
使用cluster,第一个核心将成为“主核心”,而所有其他核心将成为“工作核心”。当请求进入应用程序时,主进程将执行循环式检查,询问“哪个工作核心现在可以处理此请求?”满足要求的第一个工作核心将获得请求。重复此过程。
例子
const cluster = require('cluster');if (cluster.isMaster) {// Master processconst numWorkers = require('os').cpus().length;for (let i = 0; i < numWorkers; i++) {cluster.fork();}cluster.on('exit', (worker, code, signal) => {console.log(worker ${worker.process.pid} died );});
} else {// Worker process// Your application logic hereapp.listen(3000);
}
内部发生了什么?
集群模块创建多个独立的 Node.js 进程,每个进程都有自己的事件循环和内存空间。
这些进程在不同的核心上独立运行,利用多个核心来提高性能(水平扩展)。
它通过创建一个主进程和多个工作进程来运行。主进程管理工作进程之间传入连接的分配。如果工作进程发生故障,主进程可以重新生成一个新进程,从而确保在发生故障时的稳健性。
为什么要使用集群
- 提高性能:处理更高的流量并改善响应时间,特别是对于 I/O 密集型任务。
- 最大限度地提高资源利用率:充分利用服务器中所有可用的核心,显著提高处理能力。
- 增强的容错能力:如果一个工作程序崩溃,其他工作程序仍可保持应用程序运行,确保可靠性和正常运行时间。
注意:
- 工作进程共享内存和资源,因此请仔细考虑数据同步。
- 集群模块增加了应用程序架构的复杂性,因此请根据特定需求评估其优势与复杂性。
应用场景:
- 高流量网站:当单线程事件循环达到其极限时,使用集群进行水平扩展有助于有效地管理庞大的用户群。
- 长时间运行的任务:如果某些请求涉及长时间操作(如图像处理或数据加密),则将它们分布在工作进程中可以提高其他请求的响应能力。
- 容错至关重要:对于关键任务应用程序,集群模块对单个进程故障的恢复能力提供了宝贵的保护。
内置 HTTP/2 支持
虽然工作线程和集群模块解决了不同的问题,但 Node.js 的模块通过提供对高效HTTP/2 协议的http2内置支持直接解决性能问题。
这个 HTTP/2 是什么?
HTTP/2 是 HTTP/1.1 的后继者,它带来了多项性能增强:
- 多路复用:支持在单个连接上同时发送和接收多个请求和响应,消除了困扰 HTTP/1.1 的队头阻塞问题。
- 报头压缩:通过压缩来缩小报头大小,从而大幅减少数据传输开销。
- 服务器推送:允许服务器在客户端请求资源之前主动向客户端发送资源,从而可能加快页面加载时间。
Node.js 如何提供对 HTTP/2 的支持?
Node.js 提供了一个http2用于 HTTP/2 的强大模块。以下是它提供的一些功能:
- 创建 HTTP/2 服务器:使用熟悉的 Node.js 服务器模式以及用于管理流和服务器推送功能的附加选项。
- 处理 HTTP/2 客户端:访问客户端功能以连接并与 HTTP/2 服务器交互。
- 广泛的 API:探索各种方法和事件来管理连接、流、推送机制和错误处理。
开始使用 http2
Node.js 文档提供了使用 http2 模块的详细指南和示例。但是,仅提供链接是不够的。让我们通过一些实际示例来演示其用法。
1.创建一个基本的HTTP / 2服务器:
const http2 = require('http2');const server = http2.createServer();server.on('stream', (stream, headers) => {stream.respond({'status': 200,'content-type': 'text/plain',});stream.end('Hello from your HTTP/2 server!');
});server.listen(3000, () => {console.log('Server listening on port 3000');
});
此代码创建了一个简单的服务器,向通过 HTTP/2 连接的任何客户端发送“Hello”消息。
2.处理客户请求:
const http2 = require('http2');const server = http2.createServer();server.on('stream', (stream, headers) => {const path = headers[':path'];if (path === '/') {stream.respond({'status': 200,'content-type': 'text/plain',});stream.end('Hello from HTTP/2 server!');} else {stream.respond({'status': 404,'content-type': 'text/plain',});stream.end('Not found');}
});server.listen(3000, () => {console.log('Server listening on port 3000');
});
此代码扩展了前面的示例,以处理不同的请求路径(/)并发送适当的响应。
流【Streams API】
Stream 是允许开发人员连续从源读取和写入数据的对象。Stream 是用于处理 Node.js 中连续数据集合的抽象接口。可读、可写、双工和转换是 Node.js 中的四种主要流类型。每个流都是一个eventEmitter实例,它会在一定时间间隔内发出不同的事件。
什么是流
想象一下数据像水流一样流动 — — 这就是本质上的概念
流的一个独特功能是它不是一次性读取内存中的所有数据,而是读取并处理小块数据。这样,就不必一次性保存和处理整个文件。
Streams 可用于构建实际应用程序,例如视频流应用程序,使用此服务,不必一次性下载所有视频或音频源,而是可以立即观看视频并收听音频。这就是浏览器以连续的块流形式接收视频和音频的方式。如果这些网站在流式传输之前先等待整个视频和音频下载完毕,则播放视频可能需要很长时间。
流基于一个称为缓冲区的概念进行工作。缓冲区是一种临时内存,用于保存数据,直到流被使用为止。
流表示随时间推移传递的连续数据块序列。Node.js 提供各种流类型,每种类型都适用于不同的用例:
- 可读流:发出数据块以供使用,非常适合读取文件、网络连接或用户输入。
- 可写流:允许写入数据块,非常适合写入文件、网络连接或数据库。
- 双工流:结合读写功能,适用于套接字或管道等双向通信。
- 转换流:在数据流过时对其进行修改,从而实现加密、压缩或数据操作。
为什么要使用 Streams?
在涉及大型数据集或连续数据流的场景中,流非常有用。它们具有以下几个优点:
- 内存效率:它们分块处理数据,避免一次将整个数据集加载到内存中。
- 非阻塞特性:它们不会阻塞主线程,从而使应用程序在处理数据时保持响应。
- 灵活性:不同的流类型可满足各种数据处理需求。
开始使用 Streams
const fs = require('fs');const readableStream = fs.createReadStream('large_file.txt');readableStream.on('data', (chunk) => {console.log('Received data chunk:', chunk.toString());
});readableStream.on('end', () => {console.log('Finished reading file');
});
此代码large_file.txt
分块读取文件并将其记录到控制台。
结论
- 流是允许从源读取数据并将数据写入目标的对象。
- 可读、可写、双工和变换是 Node.js 中的四种基本流类型。
- 管道方法是使用流的最简单、最容易的方法。
- 链接是一种将一个流的输出连接到另一个流并创建多个流的操作链的机制。
- 可读流中最重要的事件是数据事件和结束事件。
- 可写流中最重要的事件是耗尽事件和完成事件。
- 可读流可以操作流动心情或者暂停心情。
REPL (Read-Eval-Print Loop)
REPL 是Read Evaluate Print Loop的缩写,它是一种编程语言环境(本质上是一个控制台窗口),它接受单个表达式作为用户输入,执行该表达式,并在执行后将结果返回到控制台。REPL 会话允许快速测试和执行基本的 JavaScript 程序。可以在 REPL 上轻松测试代码的独立部分。
想象一个沙盒环境,可以在其中试验代码片段、测试想法并获得即时反馈 - 这就是 REPL 的本质。
介绍
REPL(READ、EVAL、PRINT、LOOP)是相当于Unix/Linux中Shell的命令行环境。Node在安装时自带REPL环境。系统通过显示其执行的指令的结果来与用户通信。它对于开发和调试过程都很方便。REPL的所有部分都有特定的任务。
- 读取:读取用户提供的输入。经过必要的解析后,将信息保存在内存中。
- Eval:对解析信息后的数据结构进行求值,并生成结果。
- 打印:将评估后生成的结果显示给用户。
- 循环:以上三个步骤全部循环,直到用户按两次ctrl+c退出循环。
每个 Node.js 安装都附带 REPL,允许即时测试和探索 JavaScript 代码,而无需将其保存在文件中。
将其视为一种对话式编码体验。输入代码表达式,REPL 会对其进行评估并显示结果,可以快速迭代和学习。这使得 REPL 在以下方面具有无价的价值:
- 学习和实验:在安全、隔离的环境中尝试新的 JavaScript 功能、探索库并测试假设。
- 调试和故障排除:逐行隔离和修复代码中的问题,检查每一步的变量和值。
- 交互式开发:快速对想法进行原型设计,获得即时反馈,并迭代优化代码。
- 访问 REPL:
打开终端并输入 node。瞧!您现在已进入 REPL,可以开始游戏了。输入任何 JavaScript 变量赋值、函数调用,甚至是复杂的计算。
$ nodeWelcome to Node.js v20.11.0.
Type ".help" for more information.
> Math.random()
0.6148448277159013> "Hello"+ " " + "World"
'Hello World'> 1 + 2 - 5 * (6 / 8) + 10
9.25> var x = 10
undefined
> var y = 5
undefined
> z = 40
40
> x * y
50
与前面概述的所有强大功能相比,REPL 似乎看似简单。然而,只有通过亲身体验,它的真正价值才会显现出来。作为 Node.js 开发人员,接受 REPL 并将其集成到您的工作流程中不仅有益,而且必不可少。
命令行快捷键
Commands | Description |
---|---|
向上/向下 键 | 它用于查看命令历史记录和修改以前的命令 |
ctrl + d | 它终止节点 repl |
ctrl + c | 它用于终止当前命令 |
ctrl + c 两次 | 它终止节点 repl |
tab 键 | 它指定当前命令的列表 |
结论
- REPL 是 Read Evaluate Print Loop的缩写,它是一种编程语言环境,它接受单个表达式作为用户输入,执行它,并在执行后将结果返回到控制台。
- 您可以通过在 shell/控制台上输入node来启动 REPL。
- REPL 允许您快速测试和评估 JavaScript 代码,而无需将其保存在文件中。
- REPL 提供了一些快捷方式,尽可能减少编写命令所需的时间。
- REPL 的行为可以通过某些命令(如.break、.clear、.help等)控制。
- 你可以在 REPL 中写入算术表达式,然后按下 Enter 键即可得到计算结果。
- 您可以以与在 javascript 文件中相同的方式在 REPL 中定义变量。
结论
在 Node.js 提供的强大工具库中,工作线程可处理 CPU 密集型任务,集群模块可实现水平扩展,http2可提供 HTTP/2 网络协议的强大功能,流可提供高效的数据处理,REPL可实现交互式探索和学习。
通过掌握这些功能,您将释放 Node.js 的全部潜力并构建高性能、可扩展且令人愉快的开发体验。
相关文章:
探索5 大 Node.js 功能
目录 单线程 Node.js 工作线程【Worker Threads】 Node.js 进程 进程缺点 工作线程 注意 集群进程模块【Cluster Process Module】 内部发生了什么? 为什么要使用集群 注意: 应用场景: 内置 HTTP/2 支持 这个 HTTP/2 是什么&…...
EZUIKit.js萤石云vue项目使用
EZUIKit.js 是萤石云(Ezviz)提供的一款用于Web端的视频播放和控制的JavaScript库。它允许开发者在网页上轻松集成视频监控、对讲、录像回放等功能,适用于安防监控、智能家居等场景。通过EZUIKit.js,你可以方便地访问萤石云平台上的…...
【Linux】磁盘分区挂载网络配置进程【更详细,带实操】
Linux全套讲解系列,参考视频-B站韩顺平,本文的讲解更为详细 目录 一、磁盘分区挂载 1、磁盘分区机制 2、增加磁盘应用实例 3、磁盘情况查询 4、磁盘实用指令 二、网络配置 1、NAT网络原理图 2、网络配置指令 3、网络配置实例 4、主机名和host…...
Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8?
Java 选择 UTF-16 编码而不是更节省内存的 UTF-8 这一决定,涉及多个层面的设计权衡,包括历史原因、虚拟机(JVM)实现的复杂度、性能和字符处理的一致性。要理解这个问题,我们需要从 Java 语言的设计初衷、JVM 的工作机制…...
损失函数篇 | YOLOv10 引入 Inner-IoU 基于辅助边框的IoU损失
作者导读:Inter-IoU:基于辅助边框的IoU损失 论文地址:https://arxiv.org/abs/2311.02877 作者视频解读:https://www.bilibili.com 开源代码地址:https://github.com/malagoutou/Inner-IoU...
夹耳开放式耳机好用吗?一篇文章告诉你答案,附上挑选避坑小知识
夹耳开放式耳机作为音频领域的新兴产品,正逐渐走入大众视野。其独特的设计和功能引发了广泛关注与讨论。究竟夹耳开放式耳机好用吗?在这篇文章中,我们将从专业角度深入剖析他的各个方面。同时,还会为你提供详细的挑选避坑小知识&a…...
WebSocket 2024/9/30
WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 与HTTP协议的区别 实现...
大数据开发--1.1大数据概论
目录 一.大数据的概念 什么是大数据? 二. 大数据的特点 三. 大数据应用场景 四. 大数据分析业务步骤 大数据分析的业务流程: 五.大数据职业规划 职业方向 岗位技术要求 六. 大数据学习路线 一.大数据的概念 什么是大数据? 数据 世界…...
Java | Leetcode Java题解之第438题找到字符串中所有字母异位词
题目: 题解: class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen s.length(), pLen p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans new ArrayList<Int…...
springboot整合MybatisPlus+MySQL
上一篇:springboot整合sentinel和对feign熔断降级 文章目录 一、准备二、主要工作三、具体步骤3.1 准备数据库环境3.20 pre引入依赖3.2 引入依赖3.3 bootstrap.yml配置mybatisplus3.40 pre引入service、mapper3.4 引入实体类、service、mapper 四、测试目录结构 五…...
【MySQL】视图、用户和权限管理
目录 视图创建视图数据修改影响删除视图视图优点 用户和权限管理查看当前的数据库拥有用户信息创建用户修改密码删除用户权限授权回收权限 视图 视图就是相当于创建一个表,将查询到的结果集给存储起来。像使用复杂的多表查询查询到的结果集就不可以对结果集操作。而…...
Linux基础(五):linux文件种类与扩展名
1.文件种类 文件种类含义正规文件( regular file )就是一般我们在进行存取的类型的文件, 在由 ls -al 所显示出来的属性方面, 第一个字符为 [ - ], 例如 [-rwxrwxrwx ]。 另外, 依照文件的内容,…...
C语言-c语言组成
1.C语言的组成 一个C源程序是由 一个或者多个.c文件 和 0个或者多个.h 文件 组成 源程序: 是指未编译的 按照一定的程序设计语言规范书写的文本文件 .c文件 : c源代码 .h文件 : 头文件(接口文件) 2. .c文件 1)预处理命令 以#开头的行,在编译之前 会事…...
编程题 7-13 日K蜡烛图【PAT】
文章目录 题目输入格式输出格式输入样例1输出样例1输入样例2输出样例2输入样例3输出样例3 题解解题思路完整代码 编程练习题目集目录 题目 股票价格涨跌趋势,常用蜡烛图技术中的 K K K 线图来表示,分为按日的日 K K K 线、按周的周 K K K 线、按月的…...
iOS开发工程师面试
iOS开发工程师面试题可以涵盖多个方面,包括但不限于iOS开发的基础知识、高级概念、性能优化、架构设计、最新技术等。 1. 基础知识 1.1 请解释iOS中的Xcode是什么,以及它在开发中的作用和功能有哪些? Xcode是用于iOS和macOS等苹果平台开发的集成开发环境(IDE),提供了代…...
无人机避障—— 激光雷达定高北醒TF03-UART(二)
无人机避障过程,光靠大疆飞控内部的气压计不准,很容易在高度较低的时候受到地面植被等障碍物影响,使得掉高严重,因此采用激光雷达定高模块进行定高。 硬件: 北醒TF03-UART、Xavier-NX 软件代码: 北醒官…...
在虚幻引擎中实现Camera Shake 相机抖动/震屏效果
在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强...
SQL Server的文本和图像函数
新书速览|SQL Server 2022从入门到精通:视频教学超值版_sql server 2022 出版社-CSDN博客 《SQL Server 2022从入门到精通(视频教学超值版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) SQL Se…...
PN8034非隔离12V300MA,SOP7/DIP7开关电源芯片
PN8034宽输出范围非隔离交直流转换芯片 PN8034SSC-R1B----SOP7, PN8034NSC-T1 ----DIP7, PN8034概述 PN8034集成PFM控制器及650V高雪州能力智能功本MOSFET,用于外图元器件极精简的小功率非隔离开关电源。PN8034内置高压启动模块,…...
VMware下Ubuntu找不到共享文件夹
在VMware的设置中已经设置了共享文件夹,在Ubuntu系统中找不到,参考了网上其他的文章,发现还是不能解决问题,无意中尝试了一小步,没想到成功解决了,在这里记录一下。 1)首先查询本机的gid 2&…...
银河麒麟桌面操作系统V10登录闪退问题解决
银河麒麟桌面操作系统V10登录闪退问题解决 1、问题描述2、问题分析3、问题解决方法第一步:修改/tmp文件夹权限第二步:重启图形化服务 💐The Begin💐点点关注,收藏不迷路💐 在使用银河麒麟桌面操作系统V10时…...
【Git原理与使用】分支管理
分支管理 1.理解分支2.创建分支2.1创建分支2.2切换分支2.3合并分支 3.删除分支4.合并冲突4.分支管理策略5.分支策略6.bug分支7.删除临时分支8.小结 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励&…...
Linux操作系统分析实验-多线程与内核模块编程,实验一
实验一 多线程与内核模块编程 一、实验目的 1、理解Linux下进程的结构; 2、理解Linux下产生新进程的方法(系统调用—fork函数); 3、掌握如何启动另一程序的执行; 4、理解Linux下线程的结构; 5、理解…...
AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸
大家好,我是灵魂画师向阳 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换,从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint An…...
linux环境oracle11.2.0.4打补丁(p31537677_112040_Linux-x86-64.zip)
上传补丁及opatch工具 创建目录并上传opatch工具和补丁包 百度网盘地址 链接: https://pan.baidu.com/s/1EA5oerm52aesZUnb5OnQsA 提取码: ib8f [oraclerhel64 ~]$ mkdir /u01/psu [oraclerhel64 ~]$ cd /u01/psu [oraclerhel64 psu]$ ll total 514572 -rw-r--r-- 1 oracle o…...
华为 HCIP-Datacom H12-821 题库 (29)
🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.运行 IS-IS 的两台路由器,只有 IIH 发送的时间间隔相同才可以建立邻接关系 A、正…...
MySQL 为什么一定要有一个主键
引言 在数据库设计中,主键(Primary Key)是一个至关重要的概念。MySQL 作为最广泛使用的关系型数据库之一,主键在 MySQL 表设计中扮演着关键角色。主键不仅决定了表中数据的唯一性和完整性,还对数据库性能、数据查询、…...
Pycharm 本地搭建 stable-diffusion-webui
一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本,否…...
python/爬虫技术/lxml工具介绍/XML和HTML解析
1.lxml介绍: lxml 是一个Python库,它提供了非常强大的XML和HTML解析功能。它基于libxml2和libxslt,是处理XML和HTML文档的首选库之一。 2.安装 首先,需要安装lxml库。可以通过pip来安装,在控制台内执行安装命令。 p…...
Kafka技术详解[5]: 集群启动
目录 集群启动 相关概念 代理:Broker 控制器:Controller 启动ZooKeeper 启动Kafka 初始化ZooKeeper 初始化服务 启动任务调度器 创建数据管理器 创建远程数据管理器 创建副本管理器 创建ZK元数据缓存 创建Broker通信对象 创建网络通信对象 注册Brok…...
wamp做的网站上传/西安网站建设优化
生成客户端程序,访问已有的服务器 生成cs文件E:\>WSDL http://localhost/asp/WebService1/Service1.asmx生成dll文件E:\>CSC /out:MyWs.dll /t:library /r:System.Web.Services.dll Service1.cs 根据wsdl生成服务器的接口,供别人调用 wsdl.exe /si…...
面试简历模板免费/seosem是什么职位
用例设计 目标 1. 掌握如何编写自动化测试用例文档 1. 编写自动化测试用例的原则 1. 自动化测试用例一般只实现核心业务流程或者重复执行率较高的功能。 2. 自动化测试用例的选择一般以“正向”逻辑的验证为主。 3. 不是所有手工用例都可以使用自动化测试来执行。 4. 尽…...
凡客之家推广平台/seo快速排名软件平台
以前听这人说genymotion好,听那人说genymotion模拟器好,身为开发者,使用google原生模拟器确实有点慢,所以本人就到genymotion官网下了个带vitrualbox的安装包,然后下一步下一步安装,安装完成后启动genymoti…...
深圳较便宜的网站建设/seo行业
获取变量类型 typeof(var) Number String 类型转换 parseInt parseFloat Date() getDate() 1-31日 getTime() 1970-1-1到当前的毫秒数 getDay() 星期几0-6 getHours() getMinutes() getSeconds() setFullYear() setDate() getFullYear()...
做视频素材哪个网站好/百度网站关键词排名助手
作用 tf.concat( values, axis, name‘concat’) 输入张量的数据沿axis 维度合并 举例使用 (1)沿着0维度合并 t1 [[1, 2, 3], [4, 5, 6]] t2 [[7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 0)<tf.Tensor: shape(4, 3), dtypeint32, numpy arra…...
佛山网站建设no.1/千万不要做手游推广员
摘要 腾兴网为您分享:PHP定时执行程序脚本的例子总结,中邮网院,智宽生活,指南针,弈客围棋等软件知识,以及包牛牛,幼儿园报名表,药品营销策划方案,excel乱码,家年华&#…...