2016-10-04 13 views
1

2つの異なるNode.jsプログラムがあります。非同期ループを制御する

1つはExpress.jsサーバー(PROGRAM1)で、ユーザーインターフェイスとRESTful APIを提供します。

もう1つはクローラ(PROGRAM2)です。これはアイテムの読み取りを続け、Webからダウンロードしてすべてをデータベースに格納します。ちなみに、私はArray.prototype.reduce()Promiseを使って、ファイルを繰り返し処理し、I/Oを順番に処理しています。

私がここでやりたいことの1つは、PROGRAM1からクローラ(PROGRAM2)の進行を監視して制御することです。

しかし、私はそれが非常に複雑であることがわかりました。

// Control the loop by this `flag`, the value can be assigned from outside 
var flag = "IDLE"; 
// The outside can read this `index`, and monitor the progress 
var current_index = -1; 
var PAGE_SIZE = 100; 
function handleBatch(index){ 
    var defer = q.defer(); 
    // Mongoose statement to find documents... 
    Book.find() 
     .skip(index*PAGE_SIZE).limit(PAGE_SIZE).then(function(books){ 
      var finished = 0; 
      for(var i=0; i<books.length; i++){ 
       var book = books[i]; 
       downloadInfo(book).then(function(bookInfo){ 
        if(flag === "STOP") 
         defer.reject(new Error("The loop should stop!")); 
        //store the info... 
        finished ++; 
        if(finished === PAGE_SIZE) 
        defer.resolve(); 
       }); 
      } 
     }); 
    return defer.promise; 
} 

var promiseHandler; 
function main(){ 
    while(true){ 
     if(flag === "IDLE") 
     continue; 
     else if(flag === "START"){ 
      var [0,1,2,3,4,5...,2500].reduce(function(lastPromise, nextIndex){ 
      promiseHandler = lastPromise.then(function(){ 
       currentIndex = nextIndex; 
      }); 
      }, q()); 
     }else if(flag === "STOP"){ 
      promiseHandler.then(null, function(err){ 
       flag = "IDLE";      
      }); 
     } 
    }  
} 

main()一例(例えば実際にはサーバであり、状態はPROGRAM1からの要求により変更することができる)です。 flagSTOPと設定すると、handleBatch()のループで変更が検出され、Exceptionがスローされ、プログラムが一時停止します。

しかし、あまりにも醜いので、エラーを投げてプロセスを制御するので、私はちょうどこの方法が好きではありません。だから私はループを制御し監視するためのより良い方法を模索しています。どんなアイディアですか?

答えて

0

node.js 'processのドキュメントを参照してください。 実行を中止することに関するご質問にお答えするには、ここをクリックしてください - >

process.exit(0);

ちょうどヒントとして、ループを使用してプログラムを制御しないでください。これは悪いです。

+0

実際、 'main()'は単なるサーバのシミュレーションです。私はプロセスをkillしたくないので、それを一時停止してシグナルで再起動できるようにしたい。 – ppn029012

0

あなたは、ノードjs内でプロセス間通信を実装する方法の後になっています。これは、ノードjを超えて広がるプログラミングの話題です。これを達成するためのパターンと手段はたくさんありますが、私のお気に入りの1つはメッセージキューを使って2つのプロセスを疎結合させることです。

ノードjsには、公開サブスクライブパターンを実装するために使用できるRedisnode-redisのようなものがあります。もちろん、動作するメッセージライブラリもたくさんあります。

場合によっては、Express APIが「一時停止」イベントを公開し、クローラーがそのイベントをサブスクライブして何らかの処置を取る可能性があります。あなたのノードのアプリケーションは非同期のままです(間違いなし!)。

+0

問題は、主に非同期ループを制御する方法、タスクの開始/一時停止/再開の方法プロセス間通信 – ppn029012

+0

この問題は、通信する必要がある2つのプログラム(プロセス間通信)を持つものとして記述します。プログラムで制御信号を渡したい場合は、単にコールバック関数を使用しないでください。 (true)は変数全体のCPUポーリングを使用しますが、これはJavaScriptでのプログラミング方法ではなく、同期型Cの書き込み方法です。 – saille

+0

PROGRAM2はサーバーの単なる例です常に実行し、要求を待っている)... – ppn029012

関連する問題