"everything has been done"后退出Node.js脚本的好方法



My node.js 脚本从数据库 1 中的表中读取行,执行一些处理并将行写入数据库 2。

脚本应在所有操作完成后退出。

我怎么知道是否一切都已经完成并退出节点?

如果我有这样的回调函数:

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

编辑:与此同时,很明显process.exit()也可以替换为db.close() - 但这不是放什么的问题。问题是在什么时候执行此操作,即如何以及在何处执行此回调。

但是要把它贴在某个地方并不容易。上次从 db1 读取后不正确,因为仍然必须进行处理和写入。

将它附加到 db2 的写操作并不容易,因为它必须在最后一次写入之后附加,但是每次写入都是不可或缺的,并且不知道它是否是最后一次写入。

理论上也可能发生这种情况,最后一次写入已完成,但在此之前的另一次写入仍在执行。


编辑:对不起,我可以看到问题的解释不完整,可能令人困惑,但有些人仍然理解,下面有很好的答案。请继续阅读评论和答案,它应该给你全貌。


编辑:我可以想到一些"阻塞"控制器机制。脚本的不同部分为每个打开的"作业"向控制器添加阻止程序,并在作业完成后释放它们,当不再存在 bockers 时,控制器退出脚本。也许异步可以提供帮助:https://github.com/caolan/async

我也担心这会破坏代码和逻辑不合理。

JohnnyHK给出了很好的建议;除了Node.js已经为你做了选项2。

当没有更多的

I/O、计时器、间隔等(预期没有更多的工作)时,进程将退出。如果您的程序在完成所有工作后没有自动退出,那么您就有了一个错误。也许您忘记关闭数据库连接,或者clearTimeout()clearInterval()。但是,与其打电话给process.exit(),不如借此机会确定泄漏。

两个主要选项是:

  1. 使用异步处理协调模块,如异步(如您所提到的)。
  2. 保留您自己的未完成写入计数,然后在计数计数达到 0 时退出。

虽然使用计数器可能很诱人(简单,易于实现的想法),但它会用不相关的逻辑污染你的代码。

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对我来说感觉就像没有delete C++ new。也许比较不好,但忍不住:)

相关内容

  • 没有找到相关文章

最新更新