3

私は最近 node.js ミートアップに参加しましたが、講演を行った人は次のようなことを言いました

私はnode.jsが初めてで、これが何を意味するのかわかりません。誰か説明してくれませんか?

編集:コメントで尋ねられたように、ここに詳細なバージョンがあります:私はnode.jsの紹介のためのミートアップにいました。聴衆の誰かが講演者に、node.js の最大の欠点は何だと思うか尋ねました。彼は、node.js がジェネレーターを取得するまでは、複数回の並列 I/O に対する適切な解決策がないと述べました。大規模な Web アプリでは、これを行う必要があります。複数のラウンドで memcache を並行してヒットすることは 1 つの例であり、データベースとサードパーティ API は別の例です。ジェネレーター、スレッド、またはマイクロスレッドをサポートする Python、Ruby、または Go などの言語から来た人は、プラットフォームがコールバックのみに依存する可能性があることを受け入れるのに苦労するでしょう。

4

1 に答える 1

0

彼は、シーケンス ヘルパーについて言及していた可能性があります。次のコールバックで 1 つのタスクを実行すると、チェーンが同期的に実行されることになります。

これは、膨大な量のデータを Mongo コレクションに挿入するために使用するジェネレーターの例です。これにより、並行して実行される操作のシーケンスが生成されます。この場合、コールバック メソッドを使用してそれらを連鎖させて 100 万回の挿入を実行することは、あまり実用的ではありません。そのため、以下のようなジェネレーター/シーケンス ヘルパーを使用します。

var Inserter = function (collection) {
    this.collection = collection;
    this.data = [];
    this.maxThreads = 30;
    this.currentThreads = 0;
    this.batchSize = 1000;
    this.queue = 0;
    this.inserted = 0;
    this.startTime = Date.now();
};

Inserter.prototype.add = function(data) {
    this.data.push(data);
};

Inserter.prototype.insert = function(force) {
    var that = this;
    if (this.data.length >= this.batchSize || force) {
        if (this.currentThreads >= this.maxThreads) {
            this.queue++;
            return;
        }
        this.currentThreads++;
        console.log('Threads: ' + this.currentThreads);
        this.collection.insert(this.data.splice(0, this.batchSize), {safe:true}, function() {
            that.inserted += that.batchSize;
            var currentTime = Date.now();
            var workTime = Math.round((currentTime - that.startTime) / 1000)
            console.log('Speed: ' + that.inserted / workTime + ' per sec');
            that.currentThreads--;
            if (that.queue > 0) {
                that.queue--;
                that.insert();
            }
        });
    }
};
于 2013-06-09T18:08:22.457 に答える