Webworker-threads:在工作者中使用“require”是否可以?

时间:2015-06-20 03:34:34

标签: node.js multithreading sails.js web-worker

(使用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/22

  

TL: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可能是一个更成熟的解决方案。

1 个答案:

答案 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 ++附加组件相比,您将在更大的应用程序占用空间和更高的通信成本中为此付费。