簡體   English   中英

無法在函數內部調用非內置函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM