使用JavaScript进行多核编程?
所以我有一个递归函数,我想在代码中使用它。问题是它没有真正利用双核机器,因为js是单线程的。我尝试过使用webworkers,但对多核编程知之甚少。有人能给我指一些材料来解释它是怎么做的吗。我在谷歌上找到了这个,但是没有文档的帮助并不大=/ 如果有人能告诉我如何在没有网络工作者的情况下做到这一点,我会很高兴!那太棒了!=) 我遇到了这个。这真的很奇怪,因为它解释了如何在webworkers等中使用多核编程,但在我的chrome浏览器上执行时会抛出错误。其他浏览器也是如此使用JavaScript进行多核编程?,javascript,html,parallel-processing,web-worker,Javascript,Html,Parallel Processing,Web Worker,所以我有一个递归函数,我想在代码中使用它。问题是它没有真正利用双核机器,因为js是单线程的。我尝试过使用webworkers,但对多核编程知之甚少。有人能给我指一些材料来解释它是怎么做的吗。我在谷歌上找到了这个,但是没有文档的帮助并不大=/ 如果有人能告诉我如何在没有网络工作者的情况下做到这一点,我会很高兴!那太棒了!=) 我遇到了这个。这真的很奇怪,因为它解释了如何在webworkers等中使用多核编程,但在我的chrome浏览器上执行时会抛出错误。其他浏览器也是如此 错误:9Uncaught
错误:9Uncaught ReferenceError:Worker.js中未定义Worker,据我所知,这只有在新的HTML5标准中才可能实现。关键字是“网络工作者” 另见: 更新(2018-06-21):对于来这里搜索JavaScript多核编程的人来说,不一定是浏览器JavaScript(对于这一点,的答案仍然适用,因为它是):Node.js现在支持功能标志后面的多线程(
——实验工作者
):
在我脑海中写下这一点,对源代码没有任何保证。请对我宽容点 据我所知,你不能真正用JavaScript在线程中编程。网络工作者是一种多元编程的形式;然而JavaScript本质上是单线程的(基于事件循环) webworker是独立的执行线程,因为它不与启动它的脚本共享任何内容;没有对脚本的全局对象(通常在浏览器中称为“窗口”)的引用,也没有对主脚本变量(发送到线程的数据除外)的引用 把网络工作者想象成一个小“服务器”,被问到一个问题并提供答案。您只能将字符串发送到该服务器,而它只能解析该字符串并返回其计算结果
// 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);
});
然后,您可以使用其postMessage()方法将消息(字符串)发送到此线程:
示例工作脚本(“echo”服务器)可以是:
无论您发布到该线程的内容是什么,都将被解码、重新编码并发回。当然,你可以做任何你想做的处理。该工人将保持活跃;您可以在其上调用terminate()
(在主脚本中;即w.terminate()
)来结束它,或者在您的工作程序中调用self.close()
总结一下:您可以将函数参数压缩成一个JSON字符串,该字符串使用postMessage
发送、解码并“在另一端”(在worker中)处理。计算结果将发送回“主”脚本
解释为什么这不容易:更多的互动实际上是不可能的,而这种限制是有意的。因为共享资源(对工作者和主脚本都可见的对象)将同时受到两个线程的干扰,所以您需要管理对该资源的访问(即锁定),以防止争用情况
消息传递、无共享的方法并不广为人知,主要是因为大多数其他编程语言(例如C和Java)使用在相同地址空间上运行的线程(而其他语言,例如Erlang,则不这样)。考虑这一点:
- 由于相关的死锁/竞争条件的复杂性,很难使用互斥机制(互斥机制)编写更大的项目。这是能让成年男人哭泣的东西李>
- 相比之下,传递消息非常容易,没有共享任何语义。代码是孤立的;你确切地知道什么进入了你的员工,什么来自于你的员工。死锁和竞争条件是不可能实现的李>
<>太长了,读不下去了,回答你的问题(上面都是;TL;DR版本):不,没有网络工作者你不能这么做。但是除了浏览器支持之外,web workers并没有什么真正的错误,就像HTML5一般的情况一样。web workers是客户端的答案。对于nodej,有许多方法。最流行-使用
pm2
或类似工具生成多个进程。运行单个进程和派生/分支子进程。你可以在谷歌上搜索这些,并会找到很多样本和战术
Web workers已经得到所有浏览器的良好支持
API和样本:
问得好,因为我以前从未听说过网络工作者。你可以在这里找到一个很好的文档和一个很酷的抽象。谢谢,我以前和webworkers一起工作过,他们在释放UI方面做得很好。将其用于我的web应用程序游戏计算。但我真的希望有一些像样的文档化代码来理解如何使用它的多核编程方面。如果javascript本身能够做到这一点,那将是非常棒的,但这是一个长期目标=/您可能会想出一种方法来做到这一点。但您的基本建议是,“选择一种编程语言,其实现通常执行缓慢,然后并行”。具有大量计算任务的人首先选择一种实现被认为是快速的语言(例如编译语言),然后选择并行语言。如果Javascript被JIT编译,那么与Javascript并行可能更有意义
w.postMessage("Hello, this is my message!");
// 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))
})