javascript - 在 JavaScript 中的 Web Workers 中使用 Synaptic 库

标签 javascript object web-worker

我正在尝试用 JavaScript 创建我的第一个 Web Worker。我得到了一个名为预测器的对象,它具有使用原型(prototype)的方法和属性,如下所示:

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)。有时训练神经网络是一个昂贵的过程,并且在脚本完成训练时网络浏览器会卡住。

为了避免这个问题,我阅读了有关网络 worker 的内容。我尝试使用对象 Predictor 进行 postMessage 并在工作线程中执行 predictor.train(),但浏览器说 Predictor 它不是一个 TransferableClonable 对象。据我所知,消息必须转换为 JSON,并且我无法像在其他语言中序列化类时那样传递我的对象。

我尝试的第二个方法是在 Web Worker 中创建预测器并将其保存在 Worker 中。我使用了方法 importScripts('../../lib/synaptic/synaptic.js')importScripts('../model/predictor.js')使用我创建的库和类,但浏览器显示:

Uncaught ReferenceError: synaptic is not defined

我可以将我的对象 Predictor 作为函数 postMessage 中的参数发送吗? 解决这个问题的最佳方法是什么?

最佳答案

为什么通过消息传递预测器不起作用

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

当您将对象传递给 Web Worker 时,仅发送它们自己的属性,而不发送原型(prototype)中的属性。例如,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
 ...

关于javascript - 在 JavaScript 中的 Web Workers 中使用 Synaptic 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35990069/

相关文章:

javascript - 需要在MySQL中查找返回某个结果的查询

javascript 将新数组映射到现有数组并添加新属性

javascript - 编写 CPU 密集型客户端 HTML5 应用程序从根本上来说是错误的吗?

javascript - 新的Webworker或postMessage,每次都会创建新的线程

javascript - 在 Javascript 中访问对象时自动调用函数

javascript - 在 jQuery 中迭代复选框

javascript - 检测用户是否已从顶部滚动

java - 在java中对相关文本文件进行排序创建公共(public)索引

JavaScript 从文件中加载innerHTML

javascript - 始终使用 UTC+0 - 使用 javascript/angularjs 修复客户端浏览器上的自定义时区