0

我有一个脚本,它使用 Node.js 中的 RESTful API 将产品添加到远程数据库。它运行良好,但我想更改处理 HTTP 请求的优先级。这里有一些代码可以更好地说明我正在尝试做的事情:

step(
    function initializeCategories() {
        createCategories(products, this);
    },
    function createProducts(err, categoriesHash) {
        console.log("\nCreating products:");
        console.log("==================");

        var group = this.group(),
            productDoneCallback;

        products.forEach(function (product) {
            product.categories = categoriesHash[product.category + "/" + product.make + "/" + product.model];
            productDoneCallback = group();

            step(
                function createProduct() {
                    postProduct(convertToBigCommerceObj(product), this);
                },
                function overwriteProduct(err, product, allowOverwrite) {
                    if (err) {
                        console.log(err);
                    }

                    allowOverwrite = allowOverwrite || false;

                    if (allowOverwrite) {
                        updateProduct(product, this);
                    } else {
                        this(err, product);
                    }
                },
                function addExtraInfo(err, product) {
                    addImage(product, productDoneCallback);
                }
            );
        });
    },
    function printStats(err) {
        if (err) {
            logError(err);
        }

        var endTime = +new Date(),
            duration = endTime - startTime;

        console.log("\nFinished after " + (duration / 1000 / 60) + " minutes");
        console.log(productsAdded + " Products added successfully");
        console.log(productsUpdated + " Products updated successfully");
        console.log(productsSkipped + " Products skipped");
        console.log("Average time (milliseconds) per product was : " + (duration / totalNumProducts ));
        console.log("For more information see error log (error.log)" );
    }
);

在此代码中,始终在添加所有产品后最后添加产品图像。这是因为 forEach 循环立即将所有 postProduct 请求放入节点事件队列中。在第一个产品完成发布到服务器后,另一个条目被添加到队列的末尾以添加该产品的图像。相反,我希望新条目浮动到队列顶部并成为下一个要处理的条目(不是另一个产品帖子,可以等待)。

我意识到要做到这一点,我需要一个优先级队列。我只是不确定如何在 Node 和 Javascript 中实现这一点。

更新:在https://github.com/STRd6/PriorityQueue.js找到 PriorityQueue 的实现后,真正的麻烦是每次请求完成时异步处理队列。或者更像是每次有可用的 http 通道被释放时,我们需要获取最高优先级的项目。

4

1 回答 1

3

每当您听到“优先队列”时,您都应该考虑拥有堆数据结构。它们不是唯一的方法,但它们很容易实现,因此是一个很好的第一个 goto。

有关随机实现,请参见http://eloquentjavascript.net/appendix2.html。他们假设当您创建堆时,您传入一个函数,该函数接受一个元素并返回其优先级。在您的情况下,您可以使用类似的函数存储元素[priority, object]并初始化堆function (x) {return x[0]}

于 2012-06-19T02:43:43.633 回答