JavaScript 在 Web Worker 中使用 Synaptic 库
Using Synaptic library in Web Workers in JavaScript
我正在尝试在 javascript 中创建我的第一个网络工作者。我有一个名为 predictor 的对象,它具有使用原型的方法和属性,您可以在此处看到:
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)。有时训练神经网络是一个代价高昂的过程,当脚本完成训练时网络浏览器会冻结。
为了避免这个问题,我阅读了 web workers。我尝试使用对象 Predictor
postMessage
并在 worker 中执行 predictor.train()
,但浏览器说 Predictor
它不是 Transferable
或 Clonable
对象。据我所知,必须将消息转换为 JSON,并且我不能像在其他语言中序列化 class 那样传递我的对象。
我尝试的第二个是在 web worker 中创建预测器并将其保存在 worker 中。我使用 importScripts('../../lib/synaptic/synaptic.js')
和 importScripts('../model/predictor.js')
方法来使用我创建的库和 class 但浏览器显示:
Uncaught ReferenceError: synaptic is not defined
我可以将我的对象 Predictor
作为参数发送到函数 postMessage
中吗?
修复它的最佳方法是什么?
为什么传递 Predictor
over 消息不起作用
问题是,即使您设法通过,仅通过 Predictor
还是不够的。不要忘记在使用预测器时必须存在整个库!
当您将对象传递给 web worker 时,只会发送它们自己的属性,而不是来自原型的属性。因此,例如 Predictor.prototype.getMaxTime
不会通过。
为什么会出现 synaptic is not defined
错误(剧透:不是你的错)
我的许多问题以及其他问题都是由同一个开发人员的错误引起的:他们使用 window
而不是 self
。
在 web worker 中,self
包含全局范围以及 worker 方法(例如 postMessage
)。在浏览器中,self == window
.
因此,要解决您的问题,请将 Synaptic 源中的 window
替换为 self
。
在他们的 GitHub 存储库中搜索查询:https://github.com/cazala/synaptic/search?utf8=%E2%9C%93&q=window
在不更改突触的情况下修复错误
我对此不是 100% 确定,但这可能会成功。但它也可能会混淆那些知道工作人员如何工作的图书馆:
// 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
...
在 synaptic 的文档中我找到了一个方法 workerTrainer,这个方法在 web worker 中训练神经网络。
我正在尝试在 javascript 中创建我的第一个网络工作者。我有一个名为 predictor 的对象,它具有使用原型的方法和属性,您可以在此处看到:
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)。有时训练神经网络是一个代价高昂的过程,当脚本完成训练时网络浏览器会冻结。
为了避免这个问题,我阅读了 web workers。我尝试使用对象 Predictor
postMessage
并在 worker 中执行 predictor.train()
,但浏览器说 Predictor
它不是 Transferable
或 Clonable
对象。据我所知,必须将消息转换为 JSON,并且我不能像在其他语言中序列化 class 那样传递我的对象。
我尝试的第二个是在 web worker 中创建预测器并将其保存在 worker 中。我使用 importScripts('../../lib/synaptic/synaptic.js')
和 importScripts('../model/predictor.js')
方法来使用我创建的库和 class 但浏览器显示:
Uncaught ReferenceError: synaptic is not defined
我可以将我的对象 Predictor
作为参数发送到函数 postMessage
中吗?
修复它的最佳方法是什么?
为什么传递 Predictor
over 消息不起作用
问题是,即使您设法通过,仅通过 Predictor
还是不够的。不要忘记在使用预测器时必须存在整个库!
当您将对象传递给 web worker 时,只会发送它们自己的属性,而不是来自原型的属性。因此,例如 Predictor.prototype.getMaxTime
不会通过。
为什么会出现 synaptic is not defined
错误(剧透:不是你的错)
我的许多问题以及其他问题都是由同一个开发人员的错误引起的:他们使用 window
而不是 self
。
在 web worker 中,self
包含全局范围以及 worker 方法(例如 postMessage
)。在浏览器中,self == window
.
因此,要解决您的问题,请将 Synaptic 源中的 window
替换为 self
。
在他们的 GitHub 存储库中搜索查询:https://github.com/cazala/synaptic/search?utf8=%E2%9C%93&q=window
在不更改突触的情况下修复错误
我对此不是 100% 确定,但这可能会成功。但它也可能会混淆那些知道工作人员如何工作的图书馆:
// 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
...
在 synaptic 的文档中我找到了一个方法 workerTrainer,这个方法在 web worker 中训练神经网络。