workerhelp
Version:
基于Node.js worker_threads 的轻量级跨线程RPC通信模块,支持主线程与Worker线程之间的异步方法调用。
226 lines (175 loc) • 5.89 kB
Markdown
# WorkerRPC
基于Node.js worker_threads 的轻量级跨线程RPC通信模块,支持主线程与Worker线程之间的异步方法调用。
## 特性
🚀 双向异步方法调用
⚡ Promise原生支持
🔒 自动请求/响应匹配
🛡️ 线程安全与错误传递
🔄 生命周期自动管理
## 安装
```bash
npm install workerhelp
``
或直接引用文件:
```javascript
const { WorkerRPC, WorkerRPCHandler } = require('workerhelp');
```
## 快速开始
### 主线程(Main Thread)
``` javascript
// main.js
const { WorkerRPC } = require('workerhelp');
async function main() {
// 创建RPC实例(指向Worker文件)
const workerRPC = new WorkerRPC('./worker.js');
try {
// 调用远程方法(支持异步等待)
const sum = await workerRPC.call('add', 2, 3);
const result = await workerRPC.call('processData', { id: 1 });
console.log('Sum:', sum); // 输出: 5
console.log('Result:', result);
} finally {
// 清理资源
workerRPC.destroy();
}
}
main();
```
### Worker线程(Worker Thread)
```javascript
// worker.js
const { WorkerRPCHandler } = require('workerhelp');
// 初始化RPC处理器
const handler = new WorkerRPCHandler();
// 注册同步方法
handler.register('add', (a, b) => a + b);
// 注册异步方法
handler.register('processData', async (data) => {
await someAsyncOperation();
return { ...data, status: 'processed' };
});
// 保持线程活跃
setInterval(() => {}, 1000);
```
# API 文档
## WorkerRPC 类(主线程)
| 方法 | 参数 | 返回值 | 说明 |
|-------------|----------------------------|--------------|------------------------|
| constructor | `workerPath: string` | - | 创建 Worker 实例 |
| call | `method: string, ...args: any[]` | `Promise<any>` | 发起远程调用 |
| destroy | - | `void` | 终止 Worker 并清理资源 |
## WorkerRPCHandler 类(Worker 线程)
| 方法 | 参数 | 返回值 | 说明 |
|--------------|-----------------------------|-------|-------------|
| register | `name: string, fn: Function` | `void` | 注册可调用方法 |
| _handleRequest | (内部使用) | - | 请求处理器 |
### 最佳实践
错误处理
```javascript
// 主线程捕获错误
workerRPC.call('dangerousOp')
.catch(err => console.error('操作失败:', err));
// Worker线程抛出错误
handler.register('fail', () => {
throw new Error('示例错误');
});
```
### 超时控制
javascript
复制
// 扩展call方法(建议作为子类实现)
```
class TimeoutRPC extends WorkerRPC {
async callWithTimeout(method, timeout, ...args) {
return Promise.race([
this.call(method, ...args),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), timeout)
)
]);
}
}
```
### 注意事项
#### 数据序列化
所有参数和返回值必须是可序列化的JSON对象
不支持传递函数/原型链等特殊对象
#### 错误传递
Worker内的错误栈信息不会跨线程传递
建议在错误消息中包含关键调试信息
#### 资源管理
确保在不再需要时调用destroy()
避免在Worker中创建无法自动回收的资源
#### 扩展建议
双向调用
通过添加主线程方法注册功能,实现Worker→主线程的调用能力
### 流式处理
``` javascript
// 大数据处理示例
handler.register('processLargeData', async (chunks) => {
const stream = createTransformStream();
for await (const chunk of chunks) {
await stream.write(processChunk(chunk));
}
return stream.end();
});
```
# Node.js 多线程互斥锁(Mutex)实现
基于 `worker_threads` 和 `SharedArrayBuffer` + `Atomics` 的轻量级互斥锁,用于保护多线程环境下的临界区代码。
---
## 特性
- **线程安全**:通过原子操作实现锁的抢占和释放
- **零依赖**:仅依赖 Node.js 原生模块
- **阻塞唤醒机制**:使用 `Atomics.wait` 替代忙等待,减少 CPU 占用
- **异常安全**:`try...finally` 确保锁必然释放
---
## Mutex 快速开始
### 1. 主线程创建共享内存
```javascript
// main.js
const { Worker } = require('worker_threads');
const sharedBuffer = new SharedArrayBuffer(4);
const initialView = new Int32Array(sharedBuffer);
initialView[0] = 0; // 初始化锁状态
// 启动 4 个 Worker
for (let i = 0; i < 4; i++) {
new Worker('./worker.js', {
workerData: { sharedBuffer }
});
}
```
### 2. Worker 线程获取锁
```javascript
// worker.js
const { workerData, parentPort } = require('worker_threads');
const Mutex = require('workerhelp').Mutex;
const mutex = new Mutex(workerData.sharedBuffer);
// 需要保护的函数
async function criticalSection() {
try {
mutex.lock();
// 临界区代码(示例:修改共享资源)
console.log('[+] 进入临界区');
await performSafeOperation();
} finally {
mutex.unlock();
console.log('[-] 离开临界区');
parentPort.postMessage('done');
}
}
criticalSection();
```
### 3 API 文档
#### Mutex 类
##### 构造函数
```javascript
new Mutex(sharedBuffer: SharedArrayBuffer)//sharedBuffer: 必须为至少 4 字节的 SharedArrayBuffer
```
##### 方法列表
# 方法列表
| 方法 | 参数 | 返回值 | 说明 |
|--------|------|--------|----------------------|
| lock() | 无 | void | 阻塞直到成功获取锁 |
| unlock() | 无 | void | 释放锁并唤醒等待线程 |
# 协议
MIT License