Sho*_*vik 18 javascript parallel-processing html5 web-worker
所以我有这个严格的递归函数,我想用我的代码.问题是它没有真正利用双核机器,因为js是单线程的.我曾尝试过使用webworkers,但对多核编程并不是很了解.有人会指出一些可以解释它是如何完成的材料.我google搜索这个示例链接,但没有文档它没有多大帮助!= /
如果有人能告诉我如何在没有网络工作者的情况下做到这一点,我会很高兴!那真是棒极了!=)
我在whatwg上遇到了这个链接.这真的很奇怪,因为它解释了如何在webworkers等中使用多核编程,但是在我的chrome浏览器上执行它会引发错误.其他浏览器也是如此.
错误:9未捕获的ReferenceError:未在worker.js中定义Worker
CON*_*GHT 12
更新(2018-06-21):对于那些来这里寻找JavaScript中的多核编程的人来说,不一定是浏览器JavaScript(为此,答案仍然适用):Node.js现在支持多线程feature flag(--experimental-workers):发布信息,相关问题.
把它写在我的头顶,不保证源代码.请放轻松我.
据我所知,你无法用JavaScript编写线程.Web工作者是一种多程序设计; 但JavaScript本质上是单线程的(基于事件循环).
webworker是一个单独的执行线程,因为它不会与启动它的脚本共享任何内容; 没有引用脚本的全局对象(通常在浏览器中称为"窗口"),并且除了发送给线程的数据之外,不引用任何主脚本的变量.
将Web工作者视为一个小问题"服务器",可以提出问题并提供答案.您只能将字符串发送到该服务器,它只能解析字符串并发回它计算的内容.
// in the main script, one starts a worker by passing the file name of the
// script containing the worker to the constructor.
var w = new Worker("myworker.js");
// you want to react to the "message" event, if your worker wants to inform
// you of a result. The function typically gets the event as an argument.
w.addEventListener("message",
function (evt) {
// process evt.data, which is the message from the
// worker thread
alert("The answer from the worker is " + evt.data);
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用其postMessage()将消息(String)发送到此线程 - 方法:
w.postMessage("Hello, this is my message!");
Run Code Online (Sandbox Code Playgroud)
示例工作者脚本("echo"服务器)可以是:
// this is another script file, like "myworker.js"
self.addEventListener("message",
function (evt) {
var data = JSON.parse(evt.data);
/* as an echo server, we send this right back */
self.postMessage(JSON.stringify(data))
})
Run Code Online (Sandbox Code Playgroud)
你发布到该线程的任何内容都将被解码,重新编码和发回.当然,你可以做任何你想要做的处理.那个工人将保持活跃; 你可以打电话terminate()给它(在你的主要剧本中;那就是w.terminate())结束它或打电话给self.close()你的工人.
总结一下:你可以做的是将函数参数压缩成一个JSON字符串,该字符串postMessage在"另一方面"(在worker中)使用,解码和处理.计算结果将发送回"主"脚本.
解释为什么这不容易:更多的交互不可能实现,而且这种限制是有意的.由于共享资源(工作者和主脚本都可见的对象)会受到两个线程同时干扰它们的影响,因此您需要管理对该资源的访问(即锁定)以防止竞争条件.
消息传递,无共享方法并不是众所周知的,主要是因为大多数其他编程语言(例如C和Java)使用在相同地址空间上运行的线程(而其他方式,例如Erlang,不是).考虑一下:
试试吧; 它能够做有趣的事情,可能是你想要的.请记住,就我所知,它仍然是实现定义是否利用多核.
NB.我刚刚获悉,至少有些实现会为您处理消息的JSON编码.
所以,要回答你的问题(以上都是; tl;博士版):不,如果没有网络工作者,你就无法做到这一点.但除了浏览器支持之外,网络工作者没有什么错误,就像一般的HTML5一样.