11

私の node.js スクリプトは、データベース 1 のテーブルから行を読み取り、いくつかの処理を行い、その行をデータベース 2 に書き込みます。

すべてが完了したら、スクリプトを終了する必要があります。

すべてが完了したかどうかを確認し、ノードを終了するにはどうすればよいですか?

次のようなコールバック関数がある場合:

function exit_node() {
  process.exit();
}

(編集: その間、process.exit() を db.close() に置き換えることもできることが明らかになりました-しかし、これはそこに何を入れるかという問題ではありません。問題は、正確にいつこれを行うかです。このコールバックを実行する方法と場所。)

しかし、どこかに取り付けるのは簡単ではありません。処理と書き込みがまだ発生する必要があるため、db1 からの最後の読み取りが正しくありません。

最後の書き込みの後に接続する必要があるため、db2 への書き込みに接続するのは簡単ではありませんが、各書き込みは独立しており、最後の書き込みかどうかはわかりません。

理論的には、最後の書き込みが終了しても、その前の別の書き込みがまだ実行中である可能性があります。


編集:申し訳ありませんが、質問の説明が完全ではなく、おそらく混乱していることがわかりますが、一部の人はまだ理解しており、以下に適切な回答があります. コメントと回答を読み続けてください。全体像がわかるはずです。


編集:「ブロッキング」コントローラーメカニズムを考えることができました。スクリプトのさまざまな部分は、開いている「ジョブ」ごとにブロッカーをコントローラーに追加し、ジョブの終了後にそれらを解放します。コントローラーは、ボッカーがなくなるとスクリプトを終了します。多分非同期が役立つかもしれません: https://github.com/caolan/async

また、これがコードとロジックを不当に爆破するのではないかと心配しています。

4

3 に答える 3

13

JohnnyHK は良いアドバイスをくれます。ただし、Node.js はすでにオプション 2 を実行しています。

I/O、タイマー、インターバルなどがなくなると (それ以上の作業は期待されない)、プロセスは終了します。すべての作業が完了した後、プログラムが自動的に終了しない場合は、バグがあります。おそらく、DB 接続を閉じるのを忘れたか、 またはclearTimeout()clearInterval()。ただし、電話する代わりに、process.exit()この機会にリークを特定することができます。

于 2012-06-04T02:41:03.513 に答える
8

主なオプションは次の 2 つです。

  1. asyncのような非同期処理調整モジュールを使用します (前述のとおり)。
  2. 未処理の書き込みの独自のカウントを保持し、カウント カウントが 0 に達したら終了します。
于 2012-06-03T18:36:13.720 に答える
3

カウンターを使用することは魅力的かもしれませんが(単純で簡単に実装できるアイデア)、無関係なロジックでコードを汚染します。

db1.query(selector, function(err, results) {
  db1.close();

  // let's suppose callback gets array of results;
  // once all writes are finished, `db2.close` will be called by async
  async.forEach(results, processRow, db2.close);
});

// async iterator
function processRow(row, cb) {
  // modify row somehow
  var newRow = foo(row);

  // insert it in another db;
  // once write is done, call `cb` to notify async
  db2.insert(newRow, cb);
}

ただし、ここで使用することは、私にとってprocess.exitはC++のように感じます。悪い比較かもしれませんが、それを助けることはできません:)newdelete

于 2012-06-04T01:27:04.443 に答える