角 - 节省地创建和处置内联网络工作者

Posted

技术标签:

【中文标题】角 - 节省地创建和处置内联网络工作者【英文标题】:angular - savely create and dispose inline web workers 【发布时间】:2020-05-14 12:30:54 【问题描述】:

我的用例是我想在 Angular 库中使用网络工作者来运行繁重的计算。

由于角度 does not support web workers for libraries 尚未,我想到使用 inline web workers ,如下面的服务所示。我创建了 2 个内联工作人员并分别在 5 和 10 秒后终止它们。在 Firefox 开发工具中,我可以看到第二个和第三个线程相应地消失了。

现在我的问题是

    worker.terminate 是否会保存所有内容,以便我不必担心内存泄漏? 这种创建 Web Worker 的方法是否存在严重的安全问题? 有没有办法在 chrome 开发工具上检查所有正在运行的网络工作者?

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】:
    是的。 没有。 是的,在开发工具的“源”面板中,您会看到当前选项卡启动的所有线程。

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

启动一个 Worker 是一项很挑剔的操作,涉及大量 IO,占用大量内存,甚至会拖慢主线程。Quoting the specs themselves:

一般来说,worker 寿命长,启动性能成本高,每个实例的内存成本高。

因此,与其启动大量 Worker,不如只启动一个并与之通信,以便它执行您希望它在页面的整个生命周期中执行的操作。最好在 Worker 中闲置一个相当长的脚本,而不是为您想要执行的每个简单算术运算启动一台新计算机。

【讨论】:

谢谢!这正是我需要的信息:)

以上是关于角 - 节省地创建和处置内联网络工作者的主要内容,如果未能解决你的问题,请参考以下文章

类内的内联函数成员

在 Web 应用程序中注册内联服务人员

搜索引擎和浏览器服务商集中处置境外色情赌博类举报信息

计算机基础教程11 - 互联网&内联网

SRT视频编×××,更稳定的互联网传输方案

OpenCV:测量物体角位移的方法?