我们每个人都来到这个世界,并拥有我们注定要完成的任务。但是,我们不知道我们的使命是什么。因此,我们需要反思前进的道路并保持理解。就在我们理解我们的使命和斗争意义时,我们不会在许多叉子中失去他们的指示,并且我们将变得更加牢固。-“心理学一般”
大家好,我。
因为在最近的需求中,使用了技术,然后在项目中成功应用了一些调查和调试。尽管有一些原因是他们选择从技术采用者的角度选择优化性能。将使用它。这是一个不同的技术水平。
因此,计划撰写有关科学普及和实际生产应用的文章。
然后,让我们八卦少开车。
该环境实际上是托管操作系统中运行的虚拟环境()
每次您在浏览器中打开页面时,您都会分配一个环境:也就是说,每个页面都有自己的内存,事件周期和DOM。每个页面都等同于沙盒,这不会干扰其他页面。
使用工作线程,浏览器可以在原始页面环境之外分配一个完全独立的次级子环境。本环境不能使用(例如)依赖于单线读取交互,但可以与父环境同行执行代码。
线程规范定义了三个主要工人线程
在网页上,对象可以将各种全局变量公开到其中运行的脚本。
在工人线程中,没有概念
全局对象的示例通过关键字公开
WorkerGlobalsCope属性
WorkerGlobalsCope方法
可用属性/方法是对象上属性/方法的严格子集
专用的工作线程是最简单的Web Worker线程。网页中的脚本可以创建专用的工作线程来执行页面线程之外执行其他任务。线程可以交换信息,发送网络请求,执行文件输入/输出,执行密集计算,处理大量数据并实现其他数据不适合执行线程的任务(否则页面响应将很慢)。
实际上,在工作中,我们通常会遇到最专门的工作线程。
将专用的工作线程称为{背景脚本|背景脚本}
JS线程的所有方面,包括生命周期管理,代码路径和输入/输出,都由初始化线程提供的脚本控制。
创建工作线程的最常见方法是加载JS文件:即,为构造函数提供文件路径,然后使用构造函数将脚本异步加载到背景和实例化工作线程中。
这里有几点要注意:
工作线程的脚本文件只能从与父页面相同的源中加载。来自其他源的工作线程的脚本文件将导致错误,如下所示:
假设父亲的页面是
创建时,该页面被报告为错误。
不能使用非源脚本来创建工作线程,也不会影响其他来源的脚本
建设性函数返回与新创建的工作线程通信的连接点
它可用于在工作线程和父亲的上下文之间传输信息,并捕获特殊工作线程发出的事件。
工作对象支持以下事件处理程序属性:
工人对象还支持以下方法
在专用的工作线程中,全局范围是一个实例。
因为它继承了,所以它包含其所有属性和方法。工作线程可以通过关键字访问全局范围。
两个独立的JS线程都将消息发送到一个对象,然后该对象序列化消息并将其打印在浏览器控制台中。浏览器从两个不同的JS线程接收消息,并按照您认为合适的顺序输出这些消息。
以下属性和方法添加到基础上
调用构造函数是专用工作线程生活的起点
呼叫后,它初始化了工作线程脚本的请求并将其返回到父亲的上下文中。尽管可以在父亲的上下文中立即使用工作对象,但与其相关的工作线程可能不会创建,因为网格延迟和请求脚本的初始化延迟。
一般而言,在以下三个状态下,专门的工作线程可以在信息上进行区分:{初始化|初始化},{激活|活动}和{终止|终止}。这些状态在其他上下文中不可见。尽管工人对象可能存在于父亲的上下文中,但无法确定工作人员目前是否正在处理初始化,活动或终止状态。
初始化时,尽管尚未执行工作线程脚本,但您可以首先将消息添加到队列中。这些消息等待工作线程的状态成为活动,然后将消息添加到其消息队列中。
可以看出,在主线程中,如果相应的工作线程对应,则可以在线程之间直接传达线程,而无需知道是否已经初始化了工作线程。
创建之后,专用工作线程将在页面的整个生命周期中存在,除非终止()或通过外部终止()。即使线程脚本运行,线程的环境仍然存在。
只要工作线仍然存在,就不会将其作为垃圾收集。
在整个生命周期中,专门的工作线程只会关联一个网页(也称为文档)。除非存在明确终止,只要存在关联的文档,专用的工作线程就会存在。
Worker()构造函数允许可选的配置对象作为第二个参数。
专用的工作线程也可以基于实例创建对象的脚本行中创建。
该函数的方法返回功能代码的字符串,并且该函数可以在父的上下文中定义,但是在子的上下文中执行
有这样的序列化函数的先决条件,也就是说,从闭合获得的引用不能用于函数的函数,还包括全局变量。
工作线程可用于通过编程加载和执行任何脚本
此方法将加载脚本并按加载顺序同步执行。
// worker.js
main.js
方法可以接收任何数量的脚本作为参数。执行将严格按照参数列表的顺序进行。
该脚本由常规限制加载,但是可以在工作线程中请求任何源的脚本。
在这种情况下,所有导入的脚本也将共享范围。
工人
main.js
与工作线程的通信通过异步新闻完成
这是使用序列化的消息。
fortorialworker.js
main.js
对于简单消息,请使用主线程和工作人员线程之间的消息。没有限制。
然后,您可以使用/执行线程之间的通信,并且在这里不会解释。但是大多数都足够了
工作线程是一个独立的上下文,因此上下文的传输数据将被消费。
在JS中,有三种方法可以在上下文之间传输信息:
结构克隆算法可用于在两个独立写作室之间共享数据
传递对象时,浏览器会遍历对象并在目标中生成其副本。
结构克隆算法支持的类型
呢[](https://files.mdnice.com/user/24720/2c240435-8eb9-4c74-85a7773bca8f37.png = 50%x)
注意点
当物体复杂时,结构克隆算法将具有计算消耗。因此,在实践中,尽可能避免过度复制和过度复制。
使用传输对象可以将所有权从一个上下文转移到另一个上下文。当不太可能在上下文之间复制大量数据时,此功能特别有用。
传输对象支持的类型
该方法的第二个可选参数是阵列,该数组指定应传输到目标上下文的对象。当穿越消息加载对象时,根据转移数组检查对象引用浏览器,而传输对象则在不复制的情况下转移了传输对象。他们。
指定可转移的对象,然后从父亲的上下文中删除对缓冲存储器的引用,然后分配给工作线程。
main.js
工人
既不克隆也不转移,因为ArrayBuffer可以在不同的浏览器中共享。
传递到浏览器时,浏览器只会将引用传递给原始缓冲区。结果,两个不同的JS上下文将维护对同一内存块的引用。
假设存在以下文档结构
就像上面一样,我们可以使用IN -LINE方法来创建工作线程以维持一定的时间耗尽操作。
注入一些时间 - 耗费的任务
当然,我们可以使用它来引用,然后在其他副作用或事件功能中触发,
在生产线上构建工作线程存在缺点,也就是说,不可能引入一些第三方袋子。
因为前端框架的特殊性可以在同一目录中使用,也可以使用绝对路径在同一目录中引用或使用绝对路径。非常不便。
大多数前端项目都使用项目中使用的软件包进行管理。因此,使用此方法引入软件包以不满足情况。
由于它不满意,我们需要移动数据包框架级别。在包装行业的手柄时,我们仍然需要询问它是否满足这种情况。
巧合的是,有一些类似的
本地关注
配置-
通过上述配置,我们可以编写常规组件或工具,并通过不道德的方式引入第三方包。
长期
关于工人加载器的特定用途规格没有太多解释。
在行为方面,共享的工作线程可以被视为专用工作线程的扩展。线程创建,线程选项,安全限制和行为是相同的。
共享的工作线程也在独立上下文中运行,并且只能与其他上下文传达异步。
因为简单且适用的方案受到限制,因此我不会介绍更多。
仍然有很多涉及服务线程的地方,我计划写一个。我不会在这里单独介绍它。
分享是一种态度。
全文之后,因为我看到了这一点,如果您感觉很好,就像它一样,并且“观看”。
原始:https://juejin.cn/post/7099784958390042632
