Node.js
Concurrency limit
Concurrency limit ile paralel iş kısıtlamayı öğrenirsin.
Concurrency limit
Concurrency limit, aynı anda çalışan async iş sayısını sınırlamak için kullanılan desendir. Bir havuz (pool) oluşturursun: N worker, bir kuyruktan iş çeker. Örnek: mapLimit(items, 2, fn) aynı anda en fazla 2 iş çalıştırır.
Desen şöyle: bir i sayacı, bir results dizisi ve N worker fonksiyonu. Her worker while (i < items.length) ile sıradaki işi alır, await fn(items[idx]) ile işler ve sonucu results[idx]'e yazar. Tüm worker'lar Promise.all(workers) ile beklenir. Bu, yüzlerce API isteğini aynı anda göndermemek için kullanılır; sunucu reddetmez. limit parametresi worker sayısını belirler; tipik değer 2–10 arasıdır.
Worker deseni
Bir worker async fonksiyonudur ve while döngüsü ile kuyruktan iş çeker. Örnek: async function worker() { while (i < items.length) { const idx = i; i++; results[idx] = await fn(items[idx]); } }.
Burada const idx = i; i++; deseni kritiktir: i'yi önce yerel idx'e kopyalar, sonra artırır. Böylece iki worker aynı idx'i almaz. results[idx] ataması sonucu doğru sıraya koyar; çalışan sıra farklı olsa bile sonuç dizisi orijinal sıradadır. N worker başlatılır: for (let w = 0; w < limit; w++) workers.push(worker()). Sonra await Promise.all(workers) ile hepsinin bitmesi beklenir. Bu, paralelliği sınırlı tutmanın standart yoludur.
Uygulama mapLimit fonksiyonu yaz
async function mapLimit(items, limit, fn) yaz: const results = []; let i = 0;. async function worker() ekle: while (i < items.length) { const idx = i; i++; results[idx] = await fn(items[idx]); }. for (let w = 0; w < limit; w++) workers.push(worker()) ile N worker başlat. await Promise.all(workers); return results;. main() hazır: console.log("Sonuçlar: " + results.join(",")).
Örnek çözümü göster
async function mapLimit(items, limit, fn) {
const results = [];
let i = 0;
async function worker() {
while (i < items.length) {
const idx = i;
i++;
results[idx] = await fn(items[idx]);
}
}
const workers = [];
for (let w = 0; w < limit; w++) {
workers.push(worker());
}
await Promise.all(workers);
return results;
}
async function main() {
const items = [1, 2, 3];
const fn = async function(x) { return x * 10; };
const results = await mapLimit(items, 2, fn);
console.log("Sonuçlar: " + results.join(","));
}
main();
Kendini test et
-
Parçayı rolüne eşle
- limit
- Worker sayısı
- worker
- Kuyruktan iş çeker
- Promise.all
- Tüm worker'ları bekler
- results[idx]
- Sonucu dizine yazar
-
worker while koşulunu tamamla
while (i < items.____) { const idx = i; i++; results[idx] = await fn(items[idx]); }
Cevabı göster
while (i < items.length) { const idx = i; i++; results[idx] = await fn(items[idx]); }
-
mapLimit neden kullanılır?
const results = await mapLimit(items, 2, fn)
- Aynı anda çalışan iş sayısını sınırlamak için
- Hataları yakalamak için
- Diziyi filtrelemek için
- Diziyi sıralamak için
Cevabı göster
Aynı anda çalışan iş sayısını sınırlamak için — mapLimit aynı anda çalışan iş sayısını sınırlar.
Sıradaki ders: Retry pattern