使用 Web Worker 卸载工作
Using a Web Worker to offload work
演示文稿显示了以下代码作为承诺功能的示例。
代码的目的是将与 JSON 相关的计算卸载到 Web Worker。
var worker = new Worker('asyncTask.js');
function work(json) {
return new Promise(function(resolve, reject) {
function onMessage() {
worker.removeEventListener('message', onMessage);
resolve.apply(this, arguments)
}
worker.addEventListener('message', onMessage);
worker.postMessage(json);
});
}
我说这段代码容易受到竞争条件的影响是否正确,因为 onMessage
回调接收到的消息可能与 "corresponding" postMessage
无关?
请注意,我不是 WebWorker 专家,我认为答案完全取决于工作程序代码的性质。由于 worker 上下文与普通上下文一样是单线程的,如果 worker 代码在收到消息后只是进行一些计算,并在完成后返回答案,那么即使有其他请求未决,它们也会等待。如果工作人员可能会暂停并等待更多消息,则必须设置一些内容以将响应与请求的内容相关联。
我认为为使用 Web Worker 而编写的任何类型的服务库最终可能看起来有点像 Erlang 系统,具有用于管理消息传递的浏览器上下文的前端 API往返于工人。如果 worker 通信需要匹配请求和响应,那么前端库将负责处理(例如,通过将 API 参数包装在具有唯一请求标识符或其他内容的对象中)。
演示文稿显示了以下代码作为承诺功能的示例。
代码的目的是将与 JSON 相关的计算卸载到 Web Worker。
var worker = new Worker('asyncTask.js');
function work(json) {
return new Promise(function(resolve, reject) {
function onMessage() {
worker.removeEventListener('message', onMessage);
resolve.apply(this, arguments)
}
worker.addEventListener('message', onMessage);
worker.postMessage(json);
});
}
我说这段代码容易受到竞争条件的影响是否正确,因为 onMessage
回调接收到的消息可能与 "corresponding" postMessage
无关?
请注意,我不是 WebWorker 专家,我认为答案完全取决于工作程序代码的性质。由于 worker 上下文与普通上下文一样是单线程的,如果 worker 代码在收到消息后只是进行一些计算,并在完成后返回答案,那么即使有其他请求未决,它们也会等待。如果工作人员可能会暂停并等待更多消息,则必须设置一些内容以将响应与请求的内容相关联。
我认为为使用 Web Worker 而编写的任何类型的服务库最终可能看起来有点像 Erlang 系统,具有用于管理消息传递的浏览器上下文的前端 API往返于工人。如果 worker 通信需要匹配请求和响应,那么前端库将负责处理(例如,通过将 API 参数包装在具有唯一请求标识符或其他内容的对象中)。