7个答案
JavaScript是一种语言,它不定义线程模型,也不一定是单线程的 大多数浏览器在历史上都是单线程的(尽管变化很快: 工业工程 , 铬 , Firefox浏览器 ),大多数JavaScript实现都发生在浏览器中 Web Workers不是JavaScript的一部分,它们是可以通过JavaScript访问的浏览器功能
-
13 -
9 -
5 @JamesDrinkard javascript 仍然是单线程 即使是网络工作者。 Web工作者不会以任何以前没有的方式使javascript多线程化,请这样想:您实际上是在启动另一个单线程进程并与之通信,就像您可以在node.js中那样。 浏览器中的javascript是单线程的,而worker中的java脚本是单线程,但它们可以通过一个瘦通道相互通信。 – TKoL公司 评论 2018年3月15日11:17 -
这就是我的理解:浏览器使用一个线程(包含javascript代码)来呈现DOM并处理相关的事件循环(也可以包含javascripts代码来执行非DOM操作,例如添加两个数字),但我们可以使用worker,通过它,浏览器只能执行非DOM(javascript still)代码。 然后,我们可以在两者之间同步数据(在此处插入多线程概念)。 所以,改写“詹姆斯·德利卡德”, “浏览器以单线程javascript处理DOM” ; 我们仍然可以使用其他javascript线程 不要触摸DOM – 呆头呆脑的 评论 2018年10月30日6:36
var计数器=0; 函数asyncAddCounter(){ var xhttp=新的XMLHttpRequest(); xhttp.onreadystatechange=函数(){ if(this.readyState==4){ 计数器++; } }; xhttp.open(“GET”,“/a/remote/resource”,true); xhttp.send(); } asyncAddCounter(); 计数器++;
Firefox浏览器: 并发模型和事件循环-JavaScript|MDN Chrome使用 利比亚事件 在某些操作系统中。 工业工程: 了解事件模型(Internet Explorer)
通过结构化克隆将数据推送到web工作者(这意味着新线程读取数据): 结构化克隆算法-Web API | MDN 本质上没有“共享”变量,而是给新线程一个对象的新副本。 您可以通过转移值的所有权将数据推送到web工作者: 可传输-Web API | MDN 这意味着只有一个线程可以在任何时候读取其值。 至于web工作人员返回的结果(他们如何“写入”),主线程在收到提示时访问结果(例如使用指令 thisWorker.onmessage=函数(e){console.log(“消息”+e.data+“从工作者那里收到的”);} ). 我想这一定是通过通常的事件循环。 主线程和web工作者访问一个真正共享的内存 SharedArrayBuffer(共享阵列缓冲区) ,可以使用 原子 功能。 我发现这一点在本文中得到了明确的揭示: JavaScript:从工作者到共享内存 注意:网络工作者无法访问DOM,这是真正共享的!
-
1 JSON(Javascript Object Notation)存储在字符串中,所以应该说您可以传输字符串。 根据这个问题,postMessage可以发送各种对象的克隆: stackoverflow.com/questions/13761968/… 根据MDN文章(没有提到只有字符串是一件事),您可以传输某些对象(这比复制更快): developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage开发人员 基于此,应该可以使用MessagePorts将Workers链接到管道中。。。 – 奇诺托·沃克罗 评论 2016年11月14日23:22
Web工作者在单独的线程中执行 需要将所有工作代码托管在单独的文件中 它们不是自动垃圾收集的,所以您需要控制它们。 要运行worker,请使用worker.postMessage(“”); 要停止工作人员,调用程序代码有两种方法terminate() 和close()来自Worker本身 实例化一个工作者将花费一些内存。
var-worker=新工人('task.js');
worker.postMessage();// 启动工人。
var worker=新工人('doWork.js'); worker.addEventListener(“消息”,函数(e){ console.log('工人说:',e.data); },假); worker.postMessage(“你好,世界”);// 将数据发送给我们的员工。
self.addEventListener(“消息”,函数(e){ self.postMessage(e.data);// 将数据发送回主脚本 },错误);