[英]Can't call non built-in function inside a function
我的代碼有問題-我的代碼中有一部分需要進行大量計算(30到40秒)
我需要盡可能減少這種時間-因此,我必須利用我所有的CPU線程並分發此部分,以使其更快地完成。
幾天的時間-我對如何在nodejs中編寫多線程代碼進行了很多研究,並進行了足夠的搜索,並且就如何將nodejs單線程或多線程傳遞了很多意見,並閱讀了一些主題,例如clustering,child -過程和工人..
我寧願使用現成的庫也不要過多地研究這些主題,所以我嘗試了這個庫: 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個功能(樂趣是調用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)都會引起問題
根據庫文檔,它使用子進程-如果這樣做可以幫助,
如果您不能解決此問題-但有其他方法可以使此代碼成為可能(與任何其他庫一起使用)-請共享
這可以通過Node cluster實現:
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
使用child_process.fork()
的低級實現可能會更高效。
並且有針對Node 10及更高版本的實驗性Node worker線程 。
我自己從未使用過並行,但基於行為和使用方式,我認為@estus基本上是正確的。
如果函數本身被傳遞->它不會帶來有關先前環境的任何信息。
您將需要在函數處進行初始化,以開始使用的所有內容。
最直接的方法是將其放在主要函數中:
function fun(h)
{
const calc = function(){...}
}
最優雅的是在內部使用require。 因此,將您要共享的所有內容放入另一個模塊,將其導出,然后執行
function fun(h)
{
const tools = require('tools');
tools.calc(...)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.