综合练习
Worker + 调试一个 CPU 任务脚本。
40 分钟
综合练习
本课串联 nrt-worker、nrt-debug、nrt-cli-tools 与 nrt-apm:CLI 触发 CPU 任务 → Worker 池执行 → 主线程保持响应 → inspect 与 memory 观测。
学习目标
- 实现带 commander 子命令的
hash-batch工具 - 用 Worker 池并行处理多行输入,避免阻塞 Event Loop
- 用
--inspect与memoryUsage验证行为符合预期
项目结构建议
hash-batch/
package.json
bin/hash-batch.js # commander 入口
src/pool.js # Worker 池
src/hash-worker.js # 单任务 worker
test/smoke.test.js # 可选
前置:完成 nodejs-essentials 模块与异步课;可选 nva-cli。
功能需求
-
hash-batch hash <file>- 读文件每行非空字符串
- 提交 Worker 池,算法默认 sha256,
-a可改 - stdout:每行 JSON
{ "line": n, "digest": "..." } - stderr:进度(chalk 可选)
-
Worker 池
- 大小默认
os.availableParallelism(),-j覆盖 - 队列 + 复用 worker,不要「一行 new 一个 Worker」
- worker 异常时 reject 该任务,不拖垮整个进程(参考 nrt-callbacks)
- 大小默认
-
观测
--metricsflag:结束前 stderr 打印memoryUsage与总耗时- 文档说明如何用
node --inspect-brk bin/hash-batch.js hash data.txt断在 pool 调度处
参考片段:池化调度
import { Worker } from "node:worker_threads";
import os from "node:os";
export class WorkerPool {
constructor(size = os.availableParallelism(), workerUrl) {
this.size = size;
this.workerUrl = workerUrl;
this.workers = [];
this.queue = [];
}
run(task) {
return new Promise((resolve, reject) => {
this.queue.push({ task, resolve, reject });
this._dispatch();
});
}
_dispatch() {
// 取空闲 worker 或 spawn 至 size 上限;on message resolve
}
}