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在她的回复中所述。 显然这并不理想,我认为这个不完整的require
是node-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相比,您将在更大的应用程序占用空间和更高的通信成本中进行支付。