使用JavaScript进行多核编程?

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一样.


Rob*_*ert 5

据我所知,这只能在新的HTML5标准下实现。关键字是“ Web-Worker”

也可以看看:

HTML5:JavaScript网络工作者

HTML5 Web Workers的JavaScript线程