2017-01-25 11 views
0

私は、機能Func1Func2の同時レースプロセスを整理し、最も速い機能が解決されるときにメインを解決する必要があります。bluebird約束を使って同時関数呼び出しを作成するには?

const Promise = require('bluebird') 

const Func1 = require('./functions/func1') 
const Func2 = require('./functions/func2') 

let functions = [ 
    Func1(25), 
    Func2(40) 
] 

Promise.any(functions).spread(response => { 
    console.log(response) 
}) 

そして、両方の機能が

const Promise = require('bluebird') 

module.exports = function(data) { 
    return new Promise((resolve, reject) => { 
     let sum = 0 

     // SOME SLOW OPERATION FOR TEST 
     for (var i = 1; i <= 1000000000; i++) { 
      sum += i * data 
     } 

     resolve(sum) 
    }) 
} 

ようしかし、このコードで見えますが、機能は同期的に実行します。そして私は彼らがPromise.anyセクションで並行処理することを望みます。これを行うためにコードをどのように書き直すべきですか?私はprocess.nextTickに関数をラップしようとしていましたが、このヒントもうまくいきません。

答えて

1

約束は、同期操作を取って、それらを並行して実行できる操作にしません。それは彼らがやっていることではなく、彼らができることでもありません。代わりに、約束は、他のJavascriptが実行されている間に、すでにそれ自体がバックグラウンドで実行可能な操作を管理または調整するために使用されます。このようなことは、非同期ファイルI/O、ネットワーキング操作、タイマなどです。

node.jsのJavascriptはシングルスレッドです。他のプロセスを開始したり、ネイティブコードでスレッド/プロセスを使用するアドオンを呼び出すのでなければ、node.jsで同時に2つの同期操作を実行することはできません。まだそれを行うようには設計されていません。

node.jsで複数の同期アクティビティを同時に実行する一般的な方法は、複数のnode.jsプロセスを実行することです。これを行うと、各node.jsプロセスは独立して実行でき、複数のCPUを使用することができ、異なる同期操作を同時に実行することができます。これは、クラスタ化するか、node.jsプロセスのグループが他のプロセスを開始することによって任意の数のカスタム方法からジョブを取得している何らかの種類の作業キューで行うことができます。

+0

ありがとうございました!しかし、どのように私はメインプロセスから別のフォーク/労働者に仕事を送ることができますか?それとも、http-requestの後ろにworker-functionを置くべきですか? – mikatakana

+0

@mikatakana - プロセス間通信には多くの方法があり、ジョブキューを設計するさまざまな方法があります。子プロセスを開始すると、子プロセスのstdinおよびstdoutストリームが渡されます。あなたはそれを使うことができます。あるいは、別の仕事の準備ができているときに、httpを使ってあなたの子供があなたから新しい仕事をあなたに知らせることができます。または、おそらく100の他のデザインの誰か。 – jfriend00

+0

@mikatakana - これはあなたの質問に答えましたか? – jfriend00

関連する問題