SORU
8 Ocak 2011, CUMARTESİ


Node.js Koordinatör paralel yürütme

Node.js olay güdümlü programlama modeli biraz zor program akışını koordine etmek için yapar.

Basit sıralı yürütme yeterince kolay olan iç içe geçmiş aramalar, (biraz yazmak kıvrık olsa) evine döndü.

Ama nasıl paralel yürütme? Üç görevlerde çalışabilecek A,B,C paralel ve onlar bittiğinde, görev D. için sonuçları göndermek istediğinizi söyleyin

Çatal/bu olurdu model katıl

  • Bir çatal
  • çatal B
  • C çatal
  • Bir birleşim,B,C, D çalıştırın

Nasıl node.js bunu yazmanın ne anlamı var ? Herhangi bir en iyi uygulamalar veya videolar var mı? 11 ** her seferinde, yoksa bunun yardımcıları ile bazı kütüphane mi?

CEVAP
8 Ocak 2011, CUMARTESİ


Hiçbir şey tek dişli olduğu için node.js gerçekten paralel. Ancak, birden çok olay planlanmış olabilir ve önceden belirleyemez bir sırayla çalıştırın. Ve veritabanı erişimi gibi bazı şeyler aslında "" veritabanı ayrı bir iş çalışan ama tamamlandığında olay akışı içine yeniden entegre. kendilerini sorgulayan paralel vardır

Nasıl birden çok olay işleyicileri bir geri arama zamanlama mı? Peki, bu ortak bir tekniktir tarayıcı tarafında javascript animasyonlar kullanılır: bir değişken tamamlanma izlemek için kullanın.

Bu kesmek ve bir gibi, ve potansiyel olarak dağınık olurdu daha az bir dilde izleme yapmaya ve global değişkenler bir grup bırakarak geliyor. Ama javascript kapatma kullanabiliriz:

function fork (async_calls, shared_callback) {
  var counter = async_calls.length;
  var callback = function () {
    counter --;
    if (counter == 0) {
      shared_callback()
    }
  }

  for (var i=0;i<async_calls.length;i  ) {
    async_calls[i](callback);
  }
}

// usage:
fork([A,B,C],D);

Yukarıdaki örnekte biz zaman uyumsuz geri arama ve işlevler, bağımsız değişken gerektirir varsayarak kodu basit tutmak. Ders Kodu uyumsuz fonksiyonlara argüman geçmek değiştir ve geri arama işlevi, sonuçları toplamak ve shared_callback fonksiyonu ile iletebilirsiniz.


Ek cevap:

Aslında, bile fork() fonksiyon zaten bir kapatma kullanarak: zaman uyumsuz işlevler için bağımsız değişkenler geçirebilirsiniz

fork([
  function(callback){ A(1,2,callback) },
  function(callback){ B(1,callback) },
  function(callback){ C(1,2,callback) }
],D);

tek şey Sol A,B,C, sonuçları toplamak ve onları D. aktarmak


Daha da ek cevap:

Dayanamadım. Kahvaltı boyunca bunu düşünüp durdum. İşte sonuçlar (genellikle geri arama işlevi için bağımsız değişken olarak geçirilen) biriken fork() bir uygulama:

function fork (async_calls, shared_callback) {
  var counter = async_calls.length;
  var all_results = [];
  function makeCallback (index) {
    return function () {
      counter --;
      var results = [];
      // we use the arguments object here because some callbacks 
      // in Node pass in multiple arguments as result.
      for (var i=0;i<arguments.length;i  ) {
        results.push(arguments[i]);
      }
      all_results[index] = results;
      if (counter == 0) {
        shared_callback(all_results);
      }
    }
  }

  for (var i=0;i<async_calls.length;i  ) {
    async_calls[i](makeCallback(i));
  }
}

Bu çok kolay oldu. Bu fork() oldukça genel amaçlı yapar ve birden çok homojen olmayan olayları eşitlemek için kullanılır.

Node.js örnek kullanım:

// Read 3 files in parallel and process them together:

function A (c){ fs.readFile('file1',c) };
function B (c){ fs.readFile('file2',c) };
function C (c){ fs.readFile('file3',c) };
function D (result) {
  file1data = result[0][1];
  file2data = result[1][1];
  file3data = result[2][1];

  // process the files together here
}

fork([A,B,C],D);

Güncelleme

Bu kodu async.js ya da söz alarak çeşitli kütüphaneleri gibi kütüphaneler varlığını önce yazıldı. Async.js bu ilham olduğuna inanmak istiyorum ama herhangi bir kanıt yok. Eğer bunu bugün yapmayı düşünüyorsan eğer.. async.js ya sözler bir bak yine de. İyi bir açıklama/yukarıda cevabı düşünün şeyler uyumsuz gibi nasıl şekil sadece.paralel çalışma.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • Major FX

    Major FX

    6 HAZİRAN 2012
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006