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 开发工具中,我可以看到第二个和第三个线程相应地消失了。

现在我的问题是

  1. worker.terminate 是否可以安全地处理所有内容,这样我就不必担心内存泄漏?
  2. 这种创建 web worker 的方法是否存在一些严重的安全问题?
  3. 有没有办法在 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);
    }
}

  1. 是的。
  2. 没有
  3. 是的,在开发工具的“源”面板中,您会看到当前选项卡启动的所有线程。

但这并不意味着你正在做的事情是个好主意。

启动一个 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 中闲置,而不是为您想要执行的每个简单算术运算启动一台新计算机。