javascript - 不能在函数内部调用非内置函数
问题描述
我的代码有问题 - 我的代码中有一部分进行了很多计算(30~40 秒)
我需要尽可能地减少这个时间——所以我必须利用我所有的 CPU 线程并分配这部分以更快地完成
几天来 - 我对如何在 nodejs 中编写多线程代码进行了大量研究和谷歌搜索,我传递了许多关于 nodejs 如何是单线程或多线程的意见,并阅读了一些主题,如集群、子-进程和工人..
我更喜欢使用现成的库而不是过多地研究这些主题,所以我尝试了这个库:https ://github.com/Microsoft/napajs ,但它给我带来了一些问题。
我想要的应该很简单 - 我只有数组(准备好进行并行计算 - 每个线程都准备好处理每个元素)[数据,数据,数据,数据]
我发现这个库:https ://www.npmjs.com/package/paralleljs有点简单,并且有这个方法(地图)非常适合我的情况
让我们转到我的代码
初始化
var p = new Parallel([54,25,66,23,14,27,15,18] , { maxWorkers : 8 });
3 个函数(fun 是调用exports.calc 和calcc 的主要函数)
exports.calc = function(i,h)
{
return Math.log2(i*h);
}
function calcc(i,h)
{
return Math.log2(i*h);
}
function fun(h)
{
var sum = 0;
for (var i = 1 ; i < 55555 ; i++)
{
for (var l = 1 ; l < 55555 ; l++)
{
sum+=(exports.calc(i,l)); // in this case calc is not a function error
sum+=(calcc(i,l)); // in this case calcc is not defined error
}
}
return sum;
}
使用 map 函数开始并行计算 - 这个函数应该划分数组并让每个线程分别处理每个元素
p.map(fun).then(data => {
console.log(data);
});
错误总是发生在乐趣中 - 任何时候试图调用非内置函数 - 例如
Math.max() , String.includes() 等等,所有这些内置函数都没有问题,但任何非内置函数,如 calcc 和 exports.calc 都会出现问题
根据库文档,它使用子进程 - 如果这有帮助,
如果您对此问题无能为力 - 但有其他方法可以使此代码成为可能(与任何其他库一起) - 请分享
解决方案
这可以通过节点集群来实现:
var cluster = require('cluster');
function calcc(i,h) {
return Math.log2(i*h);
}
function fun(h) {
var sum = 0;
for (var i = 1 ; i < 5555 ; i++) {
for (var l = 1 ; l < 5555 ; l++) {
sum+=(calcc(i,l));
sum+=(calcc(i,l));
}
}
return sum;
}
if (cluster.isMaster) {
var CPU = 8;
var count = 0;
function messageHandler(msg) {
console.log(msg);
count++;
if (count == CPU)
console.log('Complete');
}
for (let i = 0; i < CPU; i++) {
var worker = cluster.fork();
worker.on('message', messageHandler);
}
} else if (cluster.isWorker) {
process.send(fun());
}
child_process.fork()
由于集群旨在用于网络连接,因此它可以提供一些开销,因此使用(由 使用)的低级实现cluster
可能更有效。
并且有用于 Node 10 及更高版本的实验性 Node工作线程。
推荐阅读
- linux - 如何对齐 Linux 块设备中的缓冲区地址
- javascript - Javascript——在迭代时操作多维数组中的值
- org-mode - 无法将组织模式导出到可折叠 HTML
- r - 如何在 ggplot2 的条形图中添加上部误差线?
- asp.net - 如何在 JWT 中包含身份角色声明?
- python-3.x - 如何在 Python Jupyter Notebook 脚本中禁用 %%cython?
- hadoop - 为什么我的数据节点不能在 hadoop-2.8.0 中工作?
- asp.net-core - 在 ASP.NET Core 中验证 OAuth 1.0a 签名的库
- javascript - 使用 Javascript 动态更改 DOM 中的文本
- javascript - 添加并显示表中列总和的结果