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

nod*_*man 10 multithreading web-worker node.js sails.js

(使用Sails.js)

我正在测试webworker-threads(https://www.npmjs.com/package/webworker-threads),以便在Node上进行长时间运行的进程,以下示例看起来很好:

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);
Run Code Online (Sandbox Code Playgroud)

但是只要我添加任何代码来查询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);
Run Code Online (Sandbox Code Playgroud)

由于数据库代码在Worker之外工作得很好,我认为它与之相关require.我尝试过在工作者之外工作的东西,比如

 var moment = require("moment");
 var deadline = moment().add(30, "s");
Run Code Online (Sandbox Code Playgroud)

而且代码也抛出异常.不幸的是,console.log只显示所有类型的错误:

{Object}
{/Object}
Run Code Online (Sandbox Code Playgroud)

所以,问题是:在工作者中使用require有任何限制或指导吗?我在这里做错了什么?

UPDATE

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

TL:DR我认为如果您需要,您应该使用节点的集群或子进程.如果你想卸载一些忙碌的工作,你应该使用tagg和load函数来获取你需要的任何助手.

在阅读这个帖子后,我看到这个问题类似于这个问题:将 Nodejs模块加载到Web Worker中

网络工作者线程作者Audreyt回答了这个问题:

这里是webworker-threads的作者.感谢您使用该模块!

有一个默认的native_fs_对象,带有可用于读取文件的readFileSync.

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

希望这可以帮助!

所以似乎importScripts是要走的路.但在这一点上,对于我想要做的事情来说可能太过苛刻,所以可能KUE是一个更成熟的解决方案.

Jam*_*vis 7

我是node-webworker-threads项目的合作者.

你不能require进去node-webworker-threads

您的更新是正确的:node-webworker-threads不(当前)支持require外部模块.

它对某些内置函数的支持有限,包括文件系统调用和版本console.log.正如您所发现的,console.log实现的版本node-webworker-threadsconsole.logNode.js中的内置版本不同; 例如,它不会自动对Object的组件进行漂亮的字符串表示.

在某些情况下,您可以使用外部模块,如Audreyt在其回复中所述.显然这并不理想,我认为不完整require是主要的"交易破坏者" node-webworker-threads.我希望今年夏天能够继续努力.

何时使用 node-webworker-threads

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

node-webworker-threads如果你想要最轻量级的可能的基于JavaScript的工作者,做一些CPU绑定的东西是很棒的.示例:素数,Fibonacci,蒙特卡罗模拟,卸载内置但可能昂贵的操作,如正则表达式匹配.

使用node-webworker-threads

node-webworker-threads强调便携性而不是方便性.对于仅限Node.js的解决方案,这意味着node-webworker-threads不是要走的路.

如果您愿意在全栈可移植性方面做出妥协,那么有两种方法:速度和便利性.

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

方便起见,请使用基于Child Process的工作池(如fork-pool).在这种情况下,每个worker都是一个成熟的Node.js实例.然后require,您可以了解内心的内容.与node-webworker-threadsC++附加组件相比,您将在更大的应用程序占用空间和更高的通信成本中为此付费.