在JavaScript中使用Web Workers中的Synaptic库

时间:2016-03-14 14:22:13

标签: javascript object web-worker

我正在尝试用javascript创建我的第一个web worker。我得到了一个名为预测器的对象,它有使用原型的方法和属性,你可以在这里看到:

function Predictor(historical, type) {
    this.historical = historical;
    this.type = type;
    this.NN = this.generateNN(this.historical);
}

Predictor.prototype.getMaxTime = function (historical) {
    return historical.length;
};

我正在使用库synapic.js,您可以创建神经网络(NN)。有时训练NN这是一个昂贵的进步,当脚本完成火车时,网络浏览器正在冻结。

我读到了关于网络工作者的信息,以避免这个问题。我尝试使用对象postMessage Predictor并在工作程序中执行predictor.train(),但浏览器说Predictor它不是Transferable或{{1}对象。由于我在下面的链接,必须将消息转换为JSON,并且我无法传递我的对象,因为我可以用其他语言序列化类。

我尝试过的第二个是在Web worker中创建预测器并将其保存在worker中。我使用方法ClonableimportScripts('../../lib/synaptic/synaptic.js')来使用我创建的库和类,但浏览器说:

importScripts('../model/predictor.js')

我可以在函数Uncaught ReferenceError: synaptic is not defined 中将对象Predictor作为参数发送吗? 解决问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

为什么通过Predictor传递信息

问题是即使你设法做到这一点,仅仅传递Predictor也是不够的。不要忘记在使用预测器时必须存在整个库!

将对象传递给Web worker时,只发送自己的属性,而不是原型中的属性。例如,Predictor.prototype.getMaxTime不会通过。

为什么会出现synaptic is not defined错误(扰流板:不是你的错)

我的许多问题以及其他问题都是由同一个开发人员的错误引起的:他们使用window代替self

在Web worker中,self包含全局范围以及worker方法(例如postMessage)。在浏览器中,self == window

为了解决您的问题,请将window替换为Synaptic来源中的self

在他们的GitHub仓库中搜索查询:https://github.com/cazala/synaptic/search?utf8=%E2%9C%93&q=window

修复错误而不更改synaptics

我对此并不是百分之百确定,但这可能会成功。但它也可能会让那些了解工人工作方式的图书馆感到困惑:

// Make global variable window that refers to global scope
self.window = self;
// Yes you can pass multiple paths at once
importScripts('../../lib/synaptic/synaptic.js', '../model/predictor.js');
// Should work. Next time make a test case so I don't have to shoot blindfolded
 ...

答案 1 :(得分:0)

在synaptic的文档中,我找到了一个名为workerTrainer的方法,该方法在Web工作者中训练NN。