0

Node.jsのRESTfulAPIを使用してリモートデータベースに製品を追加するスクリプトがあります。うまく機能しますが、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

「優先キュー」と聞いたときはいつでも、ヒープデータ構造を持つことを検討する必要があります。それらはそれを行う唯一の方法ではありませんが、実装が簡単であるため、最初の良い方法です。

ランダムな実装については、http://eloquentjavascript.net/appendix2.htmlを参照してください。彼らは、ヒープを作成するときに、要素を受け取り、その優先度を返す関数を渡すことを前提としています。あなたの場合、のような要素を格納[priority, object]し、のような関数でヒープを初期化することができますfunction (x) {return x[0]}

于 2012-06-19T02:43:43.633 に答える