携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
如果你有一些处理密集型的任务要执行,但不希望它们都在主线程运行(这可能会减慢浏 览器 /UI),可能你就会希望 JavaScript 能够以多线程的方式运行。
我们知道JavaScript是如何单线程运作的。但是,单线程并不是组织程序执行的唯一方式。设想一下把你的程序分为两个部分一部分运行在主 UI 线程下,另外一部分运行在另一个完全独立的线程中。
这种方式就会考虑了,它是否能够并行运行呢?如果并行运行的话那你能否控制共享的资源和作用域呢。最糟糕的情况就是如果作用域和资源共享的话那么,某些变量被修改了的时候,究竟是谁修改的呢?程序一定会出许多不确定的错误。你将面对所有多线程语言(java/c++)都会遇到的难题,比如合作式抢占资源的锁机制,锁我在操作系统学过,举个例子,我们知道程序运行是需要调用系统资源的,当两个任务同时运行时,1号任务占用A资源,需要B资源才能成功运行完毕,而2号任务占用B资源,需要A资源才能运行完毕,两个任务同时运行,同时请求资源,也同时都请求不到所需资源,导致两个任务都无法完成,这就是死锁,怎么解开死锁是操作系统面临的终极难题,具体可以查看操作系统章节。
还有如果共享资源和作用域的话,两个线程如何通信呢
我们看一下浏览器实现的web worker功能
从 JavaScript 主程序(或另一个 Worker)中,可以这样实例化一个 Worker:
var w1 = new Worker( "http://some.url.1/mycoolworker.js" );
这 个 URL 应该指向一个 JavaScript 文件的位置(而不是一个 HTML 页 面 ! ), 这 个 文 件 将 被加载到一个 Worker 中。然后浏览器启动一个独立的线程,让这个文件在这个线程中作 为独立的程序运行。Worker 之间以及它们和主程序之间,不会共享任何作用域或资源,那会把所有多线程编程 的噩梦带到前端领域,而是通过一个基本的事件消息机制相互联系。Worker w1 对象是一个事件侦听者和触发者,可以通过订阅它来获得这个 Worker 发出的事 件以及发送事件给这个 Worker。