Concurrency limit
- Node.js kursu
- Orta seviye
- Ders 49/116
- 5 dk
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(",")).
Başlangıç kodu
// mapLimit(items, limit, fn) fonksiyonu yaz
// limit sayıda worker ile paralel işle
// buraya yazÖrnek çözüm
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();Beklenen çıktı
Sonuçlar: 10,20,30
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
limit |
Worker sayısı |
worker |
Kuyruktan iş çeker |
Promise.all |
Tüm worker'ları bekler |
results[idx] |
Sonucu dizine yazar |
2 worker while koşulunu tamamla
while (i < items.____) { const idx = i; i++; results[idx] = await fn(items[idx]); }
while (i < items.length) { const idx = i; i++; results[idx] = await fn(items[idx]); }
Açıklama: items.length dizinin uzunluğunu verir.
3 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 Doğru cevap
- Hataları yakalamak için
- Diziyi filtrelemek için
- Diziyi sıralamak için
Açıklama: mapLimit aynı anda çalışan iş sayısını sınırlar.