(使用Sails.js)
我正在为Node上的长时间运行进程测试webworker-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,它就会抛出异常: (不在查询中使用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);
由于数据库代码在Worker之外工作得很好,我认为它与require
有关。我尝试了一些在Worker之外工作的东西,比如
var moment = require("moment");
var deadline = moment().add(30, "s");
代码也会引发异常。不幸的是,console.log只显示所有类型的错误:
{Object}
{/Object}
所以,问题是:在工作者中使用require有任何限制或指导吗?我在这里做错了什么?
更新
似乎Threads不允许使用外部模块 https://github.com/xk/node-threads-a-gogo/issues/22TL:DR我认为如果你需要,你应该使用一个节点 集群或子进程。如果你想卸载一些cpu繁忙的工作, 你应该使用tagg和load函数来抓住你的任何助手 需要。
在阅读这个帖子后,我看到这个问题与这个问题类似: Load Nodejs Module into A Web Worker
网络工作者线程作者Audreyt回答:
webworker-threads的作者。感谢您使用该模块!
您可以使用带有readFileSync的默认native_fs_对象 阅读文件。
除此之外,我主要依靠onejs来编译所有必需的 将package.json中的模块转换为importScripts的单个JS文件 使用,就像在部署到客户端Web工作者时那样 环境。 (onejs还有很多替代品 - browserify, 等)
希望这有帮助!
所以似乎importScripts
是要走的路。但在这一点上,对于我想要做的事情来说,它可能太 hacky 了,所以KUE
可能是一个更成熟的解决方案。
答案 0 :(得分:6)
我是node-webworker-threads项目的合作者。
require
node-webworker-threads
您的更新是正确的:node-webworker-threads
(目前)不支持require
外部模块。
它对某些内置函数的支持有限,包括文件系统调用和console.log
版本。如您所见,console.log
中实现的node-webworker-threads
版本与Node.js中的内置console.log
不同;例如,它不会自动对对象的组件进行很好的字符串表示。
在某些情况下,可以使用外部模块,正如audreyt在回复中所述。显然,这并不理想,我将不完整的require
视为node-webworker-threads
的主要“交易破坏者”。我希望今年夏天能够继续努力。
node-webworker-threads
node-webworker-threads
允许您针对WebWorker API进行编码,并在客户端(浏览器)和服务器(Node.js)中运行相同的代码。这就是您使用node-webworker-threads
而不是node-threads-a-gogo。
node-webworker-threads
非常棒,如果你想要最轻量级的基于JavaScript的工作者,可以做一些CPU限制的事情。示例:素数,斐波那契,蒙特卡罗模拟,卸载内置但可能很昂贵的操作,如正则表达式匹配。
node-webworker-threads
node-webworker-threads
强调便携性而不是方便性。对于仅限Node.js的解决方案,这意味着node-webworker-threads
不是最佳选择。
如果您愿意在全栈可移植性方面做出妥协,可以采用两种方式:速度和便利性。
对于速度,请尝试C++ add-on。使用NaN。我推荐Scott Frees的C++ and Node.js Integration书来学习如何做到这一点,它会为你节省很多时间。你需要为你的C ++技能付出代价才能付出代价,如果你想使用MongoDB,那么这可能不是一个好主意。
对于方便,请使用基于Child Process的工作人员库,例如fork-pool。在这种情况下,每个worker都是一个成熟的Node.js实例。然后,您可以require
了解您内心的内容。与node-webworker-threads
或C ++附加组件相比,您将在更大的应用程序占用空间和更高的通信成本中为此付费。