【问题标题】:Nodejs: parallel request, serial responseNodejs:并行请求,串行响应
【发布时间】:2011-05-21 17:46:54
【问题描述】:

我已经为stormjs做了Nodejs: How to write high performance async loop,你可以查看stormjs serial loop demo

但是并行循环仍然存在问题,例如我们有一个函数requestContext(index, callback(err, context)),它远程获取上下文'http://host/post/{index}',我们需要获取[0-99]的上下文并将上下文按顺序推送到数组中,[context0...context99]

但显然这个输出不能工作stormjs parallel loop

我还是想知道noders是怎么做这个任务的,但是你必须让这些请求并行,而不是一个一个一个,应该是并行请求和串行推送。

【问题讨论】:

  • 你为什么要为此使用storm?你为什么不直接写它没有风暴。
  • 我没有为此使用风暴,我正在为此创建风暴。我必须确保storm得到了这个案例的最佳代码,也是类似的案例。问题是如何在没有stormjs的情况下做到这一点。

标签: concurrency node.js


【解决方案1】:
var counter = 0;
// create an array with numbers 0 to 99.

_.range(0,100).forEach(function(key, value, arr) {
    // for each of them request context
    requestContext(key, function(err, context) {
        // add the context to the array under the correct key
        if (!err) {
            arr[key] = context;
        }
        // increment counter, if all have finished then fire finished.
        if (++counter === 100) {
            finished(arr);
        }
    });
});

function finished(results) {
    // do stuff
}

不需要风暴。如果你想要一个执行/流控制库,我会推荐Futures,因为它不会编译你的代码并且“隐藏魔法”。

之前你递归遍历每一个并按顺序执行它们,将它们按顺序推送到数组中。

这次你并行执行它们,并告诉每个人将数组中正确的有序键分配给它们自己的值。

_.range 创建一个包含值 0 到 99 的数组。

【讨论】:

  • 谢谢。为什么以前的串行和这个并行,因为代码说。下一次循环是否依赖于上一次循环,将决定串行还是并行。
  • @guillin 在您之前的示例中,每个请求都返回一个 url,这是下一个请求所需的。这次你有所有 100 个 url,所以你可以并行触发它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 2021-12-11
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多