CodeBlanks Logo Icon CodeBlanks

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(",")).

Başlangıç kodu

index.js
// mapLimit(items, limit, fn) fonksiyonu yaz
// limit sayıda worker ile paralel işle
// buraya yaz

Örnek çözüm

index.js
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

Soru
while (i < items.____) { const idx = i; i++; results[idx] = await fn(items[idx]); }
Cevap
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?

index.js
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.

Orta seviye bölümündeki tüm dersler