对象 Worker
Worker 对象是用于创建子线程的对象,可以在程序中创建和处理子线程。一个 Worker 对象可以理解为一个在与主线程不同的线程中执行的 JavaScript 进程。 Worker 不与主线程共享内存,不会阻塞主线程,是一种主流的异步编程方式
Worker 对象的构造函数如下:
1new Worker(String path, Object opts = {})
其中,path 参数指定的就是新线程的 JavaScript 文件路径。例如,可以写一个 work.js 文件,内容如下:
1
2
3
4const {
Worker
} = require('worker_threads');
console.log('Hi from worker');
在主程序中,通过以下代码运行 work.js:
1
2
3
4const {
Worker
} = require('worker_threads');
const worker = new Worker('path/to/work.js');
运行后,可以在主程序的控制台看到输出 "Hi from worker"。
在下面的例子里,假设我们有一个长耗时计算,我们希望将它放进另一个线程去处理,同时避免在主线程中被此计算阻塞。代码如下:
主线程:
1
2
3
4
5
6
7
8
9
10
11
12const {
Worker
} = require('worker_threads');
// create a worker thread
const fib = new Worker(__dirname + '/fib-worker.js');
// receive the result from the worker thread
fib.onmessage = (ev) => {
console.log('result: ', ev.data);
};
fib.postMessage(40);
console.log('main thread still working');
在这个例子中,我们通过 Worker 对象的构造函数创建了一个工作线程来处理 Fibonacci 数列的计算,主线程通过 postMessage() 方法给工作线程传递数据,并通过 onmessage 事件来获取处理结果。同时,主线程显示 'still working' 消息,以证明已将此计算任务 '委托'给了工作线程,并可以继续处理其他事情。
工作线程代码样式如下:
1
2
3
4
5
6
7
8
9
10
11
12// fib-worker.js
Master.onmessage = (ev) => {
const n = ev.data;
const result = fib(n);
// Once the calculation has been completed, the result is sent back to the main thread.
Master.postMessage(result);
};
function fib(n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
在工作线程中,我们监听了主线程通过入口参数 postMessage() 发送的消息,将指定的 Fibonacci 数列计算并通过 Master.postMessage() 方法将计算结果传送回主线程。
这是一个最基础的 Worker 示例,使用 Worker 对象开发时,主线程与工作线程是完全异步的,每个 Worker 对象都是一个单独的线程,在主线程中实例化的 Worker 对象并不会产生任何阻塞。
继承关系
构造函数
Worker
Worker 对象构造函数
1
2new Worker(String path,
Object opts = {});
调用参数:
- path: String, 指定 Worker 入口脚本,只接受绝对路径
- opts: Object, 构造选项,暂未支持
静态属性
defaultMaxListeners
Integer, 默认全局最大监听器数
1static Integer Worker.defaultMaxListeners;
成员属性
onload
Function, 查询和绑定接受 load 消息事件,相当于 on("load", func);
1Function Worker.onload;
onmessage
Function, 查询和绑定接受 postMessage 消息事件,相当于 on("message", func);
1Function Worker.onmessage;
onerror
Function, 查询和绑定接受 error 消息事件,相当于 on("error", func);
1Function Worker.onerror;
成员函数
postMessage
向 Master 或 Worker 发送消息,
1Worker.postMessage(Value data);
调用参数:
- data: Value, 指定发送的消息内容
on
绑定一个事件处理函数到对象
1
2Object Worker.on(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
绑定一个事件处理函数到对象
1Object Worker.on(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称将作为事件名称,属性的值将作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
addListener
绑定一个事件处理函数到对象
1
2Object Worker.addListener(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
绑定一个事件处理函数到对象
1Object Worker.addListener(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称将作为事件名称,属性的值将作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
prependListener
绑定一个事件处理函数到对象起始
1
2Object Worker.prependListener(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
绑定一个事件处理函数到对象起始
1Object Worker.prependListener(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称将作为事件名称,属性的值将作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
once
绑定一个一次性事件处理函数到对象,一次性处理函数只会触发一次
1
2Object Worker.once(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
绑定一个一次性事件处理函数到对象,一次性处理函数只会触发一次
1Object Worker.once(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称将作为事件名称,属性的值将作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
prependOnceListener
绑定一个事件处理函数到对象起始
1
2Object Worker.prependOnceListener(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
绑定一个事件处理函数到对象起始
1Object Worker.prependOnceListener(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称将作为事件名称,属性的值将作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
off
从对象处理队列中取消指定函数
1
2Object Worker.off(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
取消对象处理队列中的全部函数
1Object Worker.off(String ev);
调用参数:
- ev: String, 指定事件的名称
返回结果:
- Object, 返回事件对象本身,便于链式调用
从对象处理队列中取消指定函数
1Object Worker.off(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称作为事件名称,属性的值作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
removeListener
从对象处理队列中取消指定函数
1
2Object Worker.removeListener(String ev,
Function func);
调用参数:
- ev: String, 指定事件的名称
- func: Function, 指定事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
取消对象处理队列中的全部函数
1Object Worker.removeListener(String ev);
调用参数:
- ev: String, 指定事件的名称
返回结果:
- Object, 返回事件对象本身,便于链式调用
从对象处理队列中取消指定函数
1Object Worker.removeListener(Object map);
调用参数:
- map: Object, 指定事件映射关系,对象属性名称作为事件名称,属性的值作为事件处理函数
返回结果:
- Object, 返回事件对象本身,便于链式调用
removeAllListeners
从对象处理队列中取消所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
1Object Worker.removeAllListeners(String ev);
调用参数:
- ev: String, 指定事件的名称
返回结果:
- Object, 返回事件对象本身,便于链式调用
从对象处理队列中取消所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
1Object Worker.removeAllListeners(Array evs = []);
调用参数:
- evs: Array, 指定事件的名称
返回结果:
- Object, 返回事件对象本身,便于链式调用
setMaxListeners
监听器的默认限制的数量,仅用于兼容
1Worker.setMaxListeners(Integer n);
调用参数:
- n: Integer, 指定事件的数量
getMaxListeners
获取监听器的默认限制的数量,仅用于兼容
1Integer Worker.getMaxListeners();
返回结果:
- Integer, 返回默认限制数量
listeners
查询对象指定事件的监听器数组
1Array Worker.listeners(String ev);
调用参数:
- ev: String, 指定事件的名称
返回结果:
- Array, 返回指定事件的监听器数组
listenerCount
查询对象指定事件的监听器数量
1Integer Worker.listenerCount(String ev);
调用参数:
- ev: String, 指定事件的名称
返回结果:
- Integer, 返回指定事件的监听器数量
查询对象指定事件的监听器数量
1
2Integer Worker.listenerCount(Value o,
String ev);
调用参数:
- o: Value, 指定查询的对象
- ev: String, 指定事件的名称
返回结果:
- Integer, 返回指定事件的监听器数量
eventNames
查询监听器事件名称
1Array Worker.eventNames();
返回结果:
- Array, 返回事件名称数组
emit
主动触发一个事件
1
2Boolean Worker.emit(String ev,
...args);
调用参数:
- ev: String, 事件名称
- args: ..., 事件参数,将会传递给事件处理函数
返回结果:
- Boolean, 返回事件触发状态,有响应事件返回 true,否则返回 false
toString
返回对象的字符串表示,一般返回 "[Native Object]",对象可以根据自己的特性重新实现
1String Worker.toString();
返回结果:
- String, 返回对象的字符串表示
toJSON
返回对象的 JSON 格式表示,一般返回对象定义的可读属性集合
1Value Worker.toJSON(String key = "");
调用参数:
- key: String, 未使用
返回结果:
- Value, 返回包含可 JSON 序列化的值