2016-12-01 7 views
-1

編集: "スレッド" + "非同期"モジュールは非同期(スレッドでない場合)ではありません!それは別の非同期関数によって呼び出されました!なぜ1回の非同期が完了する前にそれを2回実行しているのですか?同じコードを非同期的に呼び出すコードがいくつか残っていました。 N個のスレッド(菌糸をスレッドモジュールを使用して)は、自分のリストにセッション変数を持っているかどうかをチェックする、コールバックは既にasync.mapで呼び出されました

async.map(threads, function (thread, cb_) { 
      zz++, 
      console.log(zz); 
      (function (id____) { 

       thread.msg({ cmd: "compare", data: id____ }, function (result) { 
        if (result) 
         compareCheck = false; 
        console.log(cb_.toString()); 

        // ERROR! 
        cb_(null, thread); // why? 
        // return cb_ doesn't solve neighter 

       }); 
      })(id__); 

     }, function (err, result) { 

      if (compareCheck) { 
       console.log("b:" + Session.cmpCtr); 

       threads[Session.cmpCtr % nThreads].msg({ 
        cmd: "add", data: id__ 
       }, function (response) { 
        setImmediate( cbCmp_); 
       }); 
      } 
      else { 

       // whatsoever gives collision, retry new one, 
       // setImmediate to stop recursion fee on cpu 
       setImmediate(function() { 

        id__ = ""; 
        for (var i = 0; i < 24; i++) 
         id__ += rndChar(); 
        cmpId(id__, cbCmp_); 
       }); 
      } 
     }); 

このコードがやって何を:ここで

は( ERROR!でマークされた)エラーを与えるいくつかのコードです新たに生成されたものと等しく、衝突がなければ、新しい変数をスレッドリストの1つに追加する。スレッドに対するコマンドが "add"の場合、変数はそのリストに追加されます。コマンドが "compare"の場合、リストの値と新しい値に応じてコールバックで真のfalse値が与えられます。

なぜasync.mapがこのエラーを出力しますか?その関数はすべてのスレッドによって実行されますが、何度も実行されるべきではありませんか?それはコールバックです。

多分async.mapはスレッドリスト(シリアル化できません)を持つことはできませんし、各セッション変数の生成時に複数のインスタンスを持つようにコピーするだけですか?

スレッドで初期化されたラッパーによって使用されている:

threads.push(new QThread(function (input, done) { 
    this.data = (typeof this.data === "undefined")? [] : this.data; 
    if (input.cmd != null && typeof input.cmd !== "undefined") { 
     if (input.cmd === "add") { 
      data.push(input.data); 
      done(true); 
     } 
     else if (input.cmd === "compare") 
     { 
      for (var i = 0; i < data.length; i++) { 
       if (data[i] == input.data) { 
        done(true); 
        return; 
       } 
      } 

      done(false); 
      return; 
     } 
    } 
})); 

編集:return cb_(null, thread);同じエラーを与えます。

シンプルなスピンロックスタイルの同期を使用するとCPUリソースが集中し、nodejsには適していないため、async.mapを使用します。ここ

出力からの誤差である:cb_(null, thread);が呼び出され

C:\...\async.js:985 
     if (fn === null) throw new Error("Callback was already called."); 
         ^

Error: Callback was already called. 
    at C:\...\async.js:985:32 
    at C:\...\async.js:1158:13 
    at C:\...\session.js:79:28 
    at Worker.<anonymous> (C:\...\qthread.js:25:13) 
    at Worker.emit (C:\...\index.js:129:35) 
    at Worker.handleMessage (C:\Users\pc\node_modules\threads\lib\worker.node\worker.js:119:17) 
    at emitTwo (events.js:106:13) 
    at ChildProcess.emit (events.js:191:7) 
    at process.nextTick (internal/child_process.js:744:12) 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 

答えて

1

後、機能がまだ残っているコードを実行します。関数は、コールバックを呼び出して実行し、リターンを停止することを保証し、この

return cb_(null, thread);

のようにコールバックに何かを終了することをお勧めします。

+0

戻り値cb_(null、thread);同じ行で同じエラーが発生する –

+0

コールバックを呼び出すたびに 'return'を置きます。 – kawadhiya21

+0

私はすべてのコールバックでファイルに戻りますが、同じエラーで同じ行が返されます。 –

関連する問題