angular - 安全地创建和处理内联网络工作者
angular - savely create and dispose inline web workers
我的用例是我想在 angular 库中使用网络工作者来 运行 繁重的计算。
自 angular does not support web workers for libraries yet, I thought of using inline web workers 如下服务所示。我创建了 2 个内联 worker,并分别在 5 秒和 10 秒后终止它们。在 Firefox 开发工具中,我可以看到第二个和第三个线程相应地消失了。
现在我的问题是
- worker.terminate 是否可以安全地处理所有内容,这样我就不必担心内存泄漏?
- 这种创建 web worker 的方法是否存在一些严重的安全问题?
- 有没有办法在 chrome 开发工具上检查所有 运行ning 网络工作者?
import { Injectable } from '@angular/core';
@Injectable()
export class WebWorkerService {
constructor() {
this.create(5000);
this.create(10000);
}
create(terminate) {
const worker = this.createWorker((data) => {
postMessage('test');
});
worker.onmessage = (e) => {
console.log('msg', e);
setTimeout(() => {
worker.terminate();
}, terminate);
};
worker.postMessage('hi');
}
createWorker(fn: (_) => void) {
const blob = new Blob(['self.onmessage = ', fn.toString()], {
type: 'text/javascript',
});
const url = URL.createObjectURL(blob);
return new Worker(url);
}
}
- 是的。
- 没有
- 是的,在开发工具的“源”面板中,您会看到当前选项卡启动的所有线程。
但这并不意味着你正在做的事情是个好主意。
启动一个 Worker 是一个很挑剔的操作,涉及大量 IO,占用大量内存,甚至会拖慢主线程。
Quoting the specs themselves:
Generally, workers are expected to be long-lived, have a high start-up performance cost, and a high per-instance memory cost.
因此,不要启动很多 Worker,而是只启动一个并与其通信,以便它在页面的整个生命周期内执行您希望它执行的操作。最好让一个相当长的脚本在 Worker 中闲置,而不是为您想要执行的每个简单算术运算启动一台新计算机。
我的用例是我想在 angular 库中使用网络工作者来 运行 繁重的计算。
自 angular does not support web workers for libraries yet, I thought of using inline web workers 如下服务所示。我创建了 2 个内联 worker,并分别在 5 秒和 10 秒后终止它们。在 Firefox 开发工具中,我可以看到第二个和第三个线程相应地消失了。
现在我的问题是
- worker.terminate 是否可以安全地处理所有内容,这样我就不必担心内存泄漏?
- 这种创建 web worker 的方法是否存在一些严重的安全问题?
- 有没有办法在 chrome 开发工具上检查所有 运行ning 网络工作者?
import { Injectable } from '@angular/core';
@Injectable()
export class WebWorkerService {
constructor() {
this.create(5000);
this.create(10000);
}
create(terminate) {
const worker = this.createWorker((data) => {
postMessage('test');
});
worker.onmessage = (e) => {
console.log('msg', e);
setTimeout(() => {
worker.terminate();
}, terminate);
};
worker.postMessage('hi');
}
createWorker(fn: (_) => void) {
const blob = new Blob(['self.onmessage = ', fn.toString()], {
type: 'text/javascript',
});
const url = URL.createObjectURL(blob);
return new Worker(url);
}
}
- 是的。
- 没有
- 是的,在开发工具的“源”面板中,您会看到当前选项卡启动的所有线程。
但这并不意味着你正在做的事情是个好主意。
启动一个 Worker 是一个很挑剔的操作,涉及大量 IO,占用大量内存,甚至会拖慢主线程。
Quoting the specs themselves:
Generally, workers are expected to be long-lived, have a high start-up performance cost, and a high per-instance memory cost.
因此,不要启动很多 Worker,而是只启动一个并与其通信,以便它在页面的整个生命周期内执行您希望它执行的操作。最好让一个相当长的脚本在 Worker 中闲置,而不是为您想要执行的每个简单算术运算启动一台新计算机。