0

我正在构建一个简单的应用程序来下载一组 XML 文件并使用异步模块 ( https://npmjs.org/package/node-async ) 将它们解析到数据库中以进行流量控制。整体流程如下:

  1. 从 API 下载数据集列表(单个请求调用)
  2. 下载每个数据集的元数据以获取 XML 文件 (async.each) 的链接
  3. 为每个数据集下载 XML (async.parallel)
  4. 将每个数据集的 XML 解析为 JSON 对象(async.parallel)
  5. 将每个 JSON 对象保存到数据库 (async.each)

实际上,对于每个数据集,都有一个父进程 (2),它包含一系列异步子进程 (3, 4, 5)。我面临的挑战是,由于在特定进程的所有子进程完成之前触发了如此多的父进程,因此子进程似乎在事件循环中排队,并且所有进程都需要很长时间特定父进程的子进程解析并允许垃圾收集清理所有内容。这样做的结果是,即使程序看起来没有任何内存泄漏,内存使用率仍然太高,最终导致程序崩溃。

一种可行的解决方案是使一些子进程同步,以便它们可以在事件循环中组合在一起。但是,我还看到了这里讨论的替代解决方案:https ://groups.google.com/forum/#!topic/nodejs/Xp4htMTfvYY ,它将父进程推入队列,并且只允许一次运行一定数量. 那么我的问题是,是否有人知道用于处理此类排队的更强大的模块,或用于处理此类流量控制的任何其他可行的替代方案。我一直在寻找,但到目前为止还没有运气。

谢谢。

4

1 回答 1

1

我决定将其发布为答案:

不要一次启动所有进程。让一个请求的回调启动下一个请求。整体工作仍然是异步的,但每个请求都是按顺序运行的。然后,您可以汇集一定数量的连接以同时运行以最大化 I/O 吞吐量。查看 async.eachLimit 并用它替换每个 async.each 示例。

您的 async.parallel 调用也可能导致问题。

于 2013-08-09T17:24:25.777 回答