(使用 Sails.js)
我正在测试 webworker-threads (https://www.npmjs.com/package/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);
但是一旦我添加任何代码来查询 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}
那么,问题是:在 Worker 中使用 require 是否有任何限制或指南?我在这里可能做错了什么?
UPDATE
看来线程不允许外部模块https://github.com/xk/node-threads-a-gogo/issues/22 https://github.com/xk/node-threads-a-gogo/issues/22
TL:DR 我认为如果你需要要求,你应该使用节点的
集群或子进程。如果你想卸载一些CPU繁忙的工作,
你应该使用 tagg 和 load 函数来获取你想要的任何助手
需要。
读完这篇文章后,我发现这个问题与这个问题类似:将 Nodejs 模块加载到 Web Worker 中 https://stackoverflow.com/questions/14107521/load-nodejs-module-into-a-web-worker
webworker-threads 的作者 Audreyt 回答道:
webworker-threads 的作者在这里。感谢您使用该模块!
有一个默认的native_fs_对象和你可以使用的readFileSync
读取文件。
除此之外,我主要依靠 onejs 来编译所有必需的
将 package.json 中的模块放入单个 JS 文件中,以便 importScripts
使用,就像部署到客户端 Web Worker 时所做的那样
环境。 (还有很多onejs的替代品——browserify,
ETC。)
希望这可以帮助!
所以它看起来importScripts
是要走的路。但在这一点上,可能太hacky对于我想做的事,所以可能KUE
是一个比较成熟的解决方案。