Webworker线程:是否可以使用内部工人“要求”?

(使用Sails.js)

我正在为Node上长时间运行的进程testingwebworker-threads( https://www.npmjs.com/package/webworker-threads ),下面的例子看起来不错:

var Worker = require('webworker-threads').Worker; var fibo = new Worker(function() { function fibo (n) { return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1; } this.onmessage = function (event) { try{ postMessage(fibo(event.data)); }catch (e){ console.log(e); } } }); fibo.onmessage = function (event) { //my return callback }; fibo.postMessage(40); 

但是,只要我添加了任何代码来查询Mongodb,它就会抛出一个exception:(不在查询中使用Sails模型,只是为了确保代码可以自行运行 – db没有密码)

 var Worker = require('webworker-threads').Worker; var fibo = new Worker(function() { function fibo (n) { return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1; } // MY DB TEST -- THIS WORKS FINE OUTSIDE THE WORKER function callDb(event){ var db = require('monk')('localhost/mydb'); var users = db.get('users'); users.find({ "firstName" : "John"}, function (err, docs){ console.log(("serviceSuccess")); return fibo(event.data); }); } this.onmessage = function (event) { try{ postMessage(callDb(event.data)); // calling db function now }catch (e){ console.log(e); } } }); fibo.onmessage = function (event) { //my return callback }; fibo.postMessage(40); 

由于DB代码在Worker外面工作的很好,我认为它与require 。 我已经尝试了一些也在工作者之外工作的东西

  var moment = require("moment"); var deadline = moment().add(30, "s"); 

代码也会引发exception。 不幸的是,console.log只显示所有types的错误:

 {Object} {/Object} 

所以,问题是:在工人内部使用要求是否有任何限制或指导? 我在这里做错了什么?

UPDATE

看来Threads将不允许外部模块https://github.com/xk/node-threads-a-gogo/issues/22

TL:DR我认为如果你需要,你应该使用节点的集群或subprocess。 如果你想卸载一些繁忙的CPU,你应该使用tagg和load函数来抓取你需要的帮助器。

在阅读这个线程时,我发现这个问题和这个问题类似:将Nodejs模块加载到Web Worker中

对于Audreyt,webworker-threads作者回答说:

webworker线程的作者在这里。 感谢您使用模块!

有一个默认的native_fs_对象,可以使用readFileSync来读取文件。

除此之外,我主要依靠onejs将package.json中所有必需的模块编译成单个JS文件,供importScripts使用,就像部署到客户端Web工作环境时一样。 (也有许多替代方法 – browserify等)

希望这可以帮助!

所以似乎importScripts是要走的路。 但是在这一点上,对于我想要做的事情可能太疯狂了,所以KUE可能是一个更成熟的解决scheme。

我是node-webworker-threads项目的协作者 。

你不能在node-webworker-threads

你的更新是正确的: node-webworker-threads目前不支持require外部模块。

它对一些内置程序的支持有限,包括文件系统调用和console.log版本。 正如您发现的那样, node-webworker-threads实现的console.log版本与Node.js中的内置console.log ; 例如,它不会自动对对象的组件进行漂亮的string表示。

在某些情况下,您可以使用外部模块,如audreyt在她的回复中所述。 显然这并不理想,我认为这个不完整的requirenode-webworker-threads的主要“破坏者”。 我希望今年夏天能在这上面工作。

何时使用node-webworker-threads

node-webworker-threads允许您针对WebWorker API进行编码,并在客户端(浏览器)和服务器(Node.js)中运行相同的代码。 这就是为什么你会使用Node-threads-a-gogo上的 node-webworker-threads

如果你想要最轻量级的可能是基于JavaScript的工作者,那么node-webworker-threads是非常好的。 例如:素数,斐波纳契(Fibonacci),蒙特卡洛模拟(Monte Carlo simulation),卸载内置的但是可能是昂贵的操作,如正则expression式匹配。

何时使用node-webworker-threads

node-webworker-threads强调便利性的便利性。 对于仅有Node.js的解决scheme,这意味着node-webworker-threads不是要走的路。

如果您愿意在全堆栈可移植性上妥协,则有两种方法可以提高速度和便利性。

为了提高速度 ,请尝试使用C ++插件 。 使用NaN 。 我推荐Scott Frees的C ++和Node.js集成书来学习如何做到这一点,它会为你节省很多时间。 你需要花费你的C ++技能来支付,如果你想使用MongoDB,那么这可能不是一个好主意。

为了方便起见 ,使用一个基于subprocess的工作池,如fork-pool 。 在这种情况下,每个worker都是一个完整的Node.js实例。 然后你可以require你的内容。 与node-webworker-threads或C ++ add-on相比,您将在更大的应用程序占用空间和更高的通信成本中进行支付。