Note.js框架中的cluster集群和断言测试的实战剖析

简介: Note.js框架中的cluster集群和断言测试的实战剖析

@[toc]

Cluster

节点。Js在单个线程中运行单个实例。为了使用当前的多核系统,用户(开发人员)有时会使用一个Node字符串。js进程来处理加载任务。
集群模块允许轻松创建共享服务器端口的子进程。

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);

  // 衍生工作进程。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作进程可以共享任何 TCP 连接。
  // 在本例子中,共享的是一个 HTTP 服务器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作进程 ${process.pid} 已启动`);
}

第一种方法(也是除Windows以外的所有平台的默认方法)是循环方法。主进程负责侦听端口,并在接收到新连接后将连接循环分发给工作进程。发行版中使用了一些内置技术,以防止工作进程过载。
第二种方法是主进程创建侦听套接字并将其发送给感兴趣的工作进程。工作进程负责直接接收连接。
理论上,第二种方法应该是最有效的,但在实践中,由于操作系统的不可预测的调度机制,分配将变得不稳定。我们遇到过这种情况:8个进程中有2个共享70%的负载。

worker.send

向工作进程或主进程发送消息,或发送句柄。
当主进程调用此方法时,它将向特定的工作进程发送消息。另一种等效方法是ChildProcess。
当工作进程调用此方法时,它将向主进程发送消息。另一种等效方法是过程。
工作进程将回显主进程发送的消息。

if (cluster.isMaster) {
  const worker = cluster.fork();
  worker.send('hi there');

} else if (cluster.isWorker) {
  process.on('message', (msg) => {
    process.send(msg);
  });
}

assert 断言测试

测试实际参数是否等于预期深度参数。使用相等运算符(==)比较原始值。
只测试可枚举自身属性,而不测试对象的原型、连接器或不可枚举属性(在这些情况下使用assert.deepStrictEqual())。例如,以下示例不会引发AssertionError,因为RegExp对象的属性不可枚举:

assert.deepEqual(/a/gi, new Date());

映射和集合中包含的子项也将进行测试。
还将测试子对象的可枚举属性:

const assert = require('assert');

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);

assert.deepEqual(obj1, obj2);

assert.deepEqual(obj1, obj3);
assert.deepEqual(obj1, obj4);

测试通过,两个对象相等。

Buffer (缓冲)

在ECMAScript 2015(ES6)引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制。Buffer类作为Node Js API引入,使其能够在TCP流或文件系统操作等场景中处理二进制数据流。
TypedArray已添加到ES6中。Buffer类更优化,更适合Node。js用例的方法实现了Uint8Array API。
Buffer类的实例类似于整数数组,但Buffer的大小是固定的,物理内存分配在V8堆之外。缓冲区的大小在创建时确定,无法调整。
Buffer类位于节点J中。它是一个全局变量,因此不需要使用require('Buffer')。缓冲器
创建一个长度为 10、且用 0x1 填充的 Buffer。

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(10, 1);
const buf3 = Buffer.allocUnsafe(10);

const buf4 = Buffer.from([1, 2, 3]);

const buf5 = Buffer.from('tést');
const buf6 = Buffer.from('tést', 'latin1');

创建一个长度为 10、且未初始化的 Buffer。
这个方法比调用 Buffer.alloc() 更快,
但返回的 Buffer 实例可能包含旧数据,
因此需要使用 fill() 或 write() 重写。

命令行选项

节点。Js您可以在开始时使用--zero-fill-buffers命令行选项,强制所有用户使用新的Buffer(size)和BufferallocUnsafe()、Buffer。AllocUnsafeSlow()或newSlowBuffer(大小)新分配的缓冲区实例在创建时自动填充0。使用此选项将更改这些方法的默认行为,并对性能产生重大影响。建议仅在需要强制新分配的Buffer实例不包含潜在敏感数据时使用--zero-fill-buffers选项。

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>

输出: auffer

const buf1 = new Buffer('buffer');
const buf2 = new Buffer(buf1);

buf1[0] = 0x61;
console.log(buf1.toString());

console.log(buf2.toString());

new Buffer

分配大小为字节的新缓冲区。如果大小大于buffer.constants.MAX_LENGTH或小于0,则抛出RangeError错误。如果大小为0,将创建长度为0的缓冲区。
在Node.js 8.0.0之前,以这种方式创建的Buffer实例的底层内存未初始化。新缓冲区的内容未知,可能包含敏感数据。使用缓冲区。alloc(size)将缓冲区初始化为0。

const buf = new Buffer(10);
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
相关文章
|
11天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
58 8
|
17天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
6天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
34 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
12天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
35 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
15天前
Next.js 实战 (二):搭建 Layouts 基础排版布局
本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
Next.js 实战 (二):搭建 Layouts 基础排版布局
|
9天前
|
存储 网络架构
Next.js 实战 (四):i18n 国际化的最优方案实践
这篇文章介绍了Next.js国际化方案,作者对比了网上常见的方案并提出了自己的需求:不破坏应用程序的目录结构和路由。文章推荐使用next-intl库来实现国际化,并提供了详细的安装步骤和代码示例。作者实现了国际化切换时不改变路由,并把当前语言的key存储到浏览器cookie中,使得刷新浏览器后语言不会失效。最后,文章总结了这种国际化方案的优势,并提供Github仓库链接供读者参考。
|
10天前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
16天前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
16天前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。
|
17天前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
28 4