Yanıtlar:
Spawn, sistem komutlarını çalıştırmak için tasarlanmış bir komuttur. Spawn komutunu çalıştırdığınızda, ona kendi işleminde çalıştırılacak, ancak düğüm işleminizde başka bir kod yürütmeyen bir sistem komutu gönderirsiniz. Kodunuzun ortaya çıkan işlemle etkileşime girmesine izin vermek için, oluşturduğunuz işlem için dinleyici ekleyebilirsiniz, ancak yeni bir V8 örneği oluşturulmaz (elbette komutunuz başka bir Düğüm komutu değilse, ancak bu durumda çatal kullanmalısınız!) Ve İşlemci üzerinde düğüm modülünüzün yalnızca bir kopyası etkin.
Çatal, V8 motorunun yeni bir örneğini çalıştıran özel bir yumurtlama örneğidir. Yani, esasen aynı Düğüm kodu tabanında çalışan birden fazla işçi veya belirli bir görev için belki de farklı bir modül oluşturabilirsiniz. Bu en çok bir çalışan havuzu oluşturmak için kullanışlıdır. Düğümün eşzamansız olay modeli, bir makinenin tek bir çekirdeğinin oldukça verimli kullanılmasına izin verirken, bir düğüm işleminin çok çekirdekli makinelerin kullanılmasına izin vermez. Bunu yapmanın en kolay yolu, aynı programın birden fazla kopyasını tek bir işlemci üzerinde çalıştırmaktır.
İyi bir kural, çekirdek başına bir ila iki düğüm işlemidir, belki de daha iyi bir ram saat / cpu saat oranına sahip makineler için veya etkinliğin kapalı kalma süresini en aza indirgemek için G / Ç üzerinde ağır ve CPU çalışmasında ışık olan düğüm işlemleri için daha fazladır. loop yeni olaylar bekliyor. Bununla birlikte, ikinci öneri bir mikro optimizasyondur ve durumunuzun birçok süreç / çekirdek ihtiyacına uygun olmasını sağlamak için dikkatli bir karşılaştırmaya ihtiyaç duyacaktır. Makineniz / senaryo için çok fazla işçi üreterek performansı düşürebilirsiniz.
Sonuçta spawn'ı, spawn'a bir Node komutu göndererek, yukarıda belirtilen şekilde kullanabilirsiniz. Ancak bu saçma olurdu, çünkü çatal V8 örnekleri oluşturma işlemini optimize etmek için bazı şeyler yapar. Sadece netleştirmek gerekirse, sonuçta ortaya çıkan çatal çatal içerir. Çatal sadece bu özel ve çok kullanışlı kullanım için idealdir.
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
TLDR
Spawn
Bir spawn oluşturulduğunda - Üst ve alt süreç arasında bir akış arayüzü oluşturur .
akış arabirimi araçları - verileri ikili biçimde arabelleğe almaONE TIME
Fork
Bir zaman çatal oluşturulur - Bir yaratır iletişim kanalı ebeveyn ve çocuk süreci arasındaki
iletişim kanalı araçları - mesajlaşma
Difference
Peki her ikisi de aynı veri aktarımı yapıyor gibi görünüyor , Aşağıdaki fark hariç
spawn ikili / kodlama formatında sürekli veri tamponu yapmak istediğinizde yararlı olacaktır , Örn. - 1GB video dosyası, resim, günlük dosyalarını aktarınONE TIME
Çatal yapmak istediğiniz zaman faydalı olacaktır mesajlaşma
Örn - JSON
veya XML
veri mesajlaşma
Conslusion
spawn , spawn işleminden ebeveyn işlemine büyük veri / dosya / görüntü akışı için kullanılmalıdır
Json / Xml mesajlaşma için fork kullanılmalıdır.
FORK
verilerin çok büyük bir yığın varsa olmak başka tamponlu sonra kullanmakSPAWN
child_process.spawn yöntemi, verilen bir komutla yeni bir işlem başlatır. Aşağıdaki imzası vardır -
child_process.spawn(command[, args][, options])
Seçenekler hakkında daha fazla bilgi edinin
Spawn () yöntemi akışları döndürür (stdout & stderr) ve işlem bir miktar veri döndürdüğünde kullanılmalıdır. spawn (), işlem yürütülmeye başlar başlamaz yanıtı almaya başlar.
child_process.fork yöntemi, Düğüm işlemleri oluşturmak için özel bir spawn () örneğidir . Aşağıdaki imzası vardır -
child_process.fork(modulePath[, args][, options])
Fork yöntemi, tüm yöntemleri normal bir ChildProcess örneğinde olmasının yanı sıra yerleşik bir iletişim kanalına sahip bir nesne döndürür.
var child = require('child_process').fork('child.js');
örneğin ana uygulamamda diyelim , şimdi 2 ayrı çekirdek çalıştıracağım. Child.js'de (süreç) ağır bir döngü çalıştırsaydım , aslında child.js'ye güç vermek için daha fazla çekirdek kullanırdım, değil mi? Bu işlemci kullanımı benim ana uygulama çekirdeğimi etkiler mi?