node.js alt işlemi - spawn ve fork arasındaki fark


141

Bu temel bir soru gibi görünebilir, ancak herhangi bir belge bulamadım:

Bir node.js sürecini çatallamak ve yumurtlamak arasındaki fark nedir? Çatallamanın özel bir yumurtlama vakası olduğunu okudum, ancak her birini kullanmak için farklı kullanım durumları / cevapları nelerdir?

Yanıtlar:


216

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


@ChrisCM, 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?
NiCk Newman

2
Başka şeyleri etkilemeden bir CPU üzerinde hiçbir şey yapmak imkansızdır. Zamanlama, paylaşılan önbellek kullanımı, BUS trafiği vb. Ancak, ayrı bir çekirdekten faydalanmalı ve ana çalıştırma döngünüzü ÇOK etkilenmeden bırakmalıdır. İki işlemin aynı tek çekirdekli işlemcide çalışmasını beklediğiniz ciddi olumsuz etkiler değil. Bu noktada, düzgün bir şekilde optimize etmek gerçekten işletim sistemi ve donanım kurulumuna bağlıdır. Farklı kurulumlar farklı sonuçlar verebilir.
ChrisCM

@ChrisCM Evet, canavar konumlandırmasını senkronize etmek için küresel bir MonsterLoop kullanıyorum ve yinelediği nesne 5.000 anahtar kadar olabilir. Ben her 2 saniyede bir yineleme ve çatal benim CPU (ana oyun bir) kapalı yüzlerce bellek kullanımı parçalama gibi görünüyor. Bu döngüyü kümelemek ve sahip olduğum çekirdek başına xx miktarını çalıştırmak yerine bu şekilde yapmayı tercih ederim ... Anlayışınız için ~ Şimdi sadece Redis mi yoksa dahili IPC mi kullanacağımı bilmiyorum: P
NiCk Newman

2
"Neden" e hitap ettiğiniz için teşekkür ederim - bu kadar okuduğum tüm mesajlar açıklamanın bu basit kısmını kaçırdı.
aaaaaa

@ChrisCM ".. ama düğüm sürecinizde başka bir kod yürütmüyor .." diye cevaplıyorsunuz. Bu ana iş parçacığının beklediği ve hiçbir şey işlemediği anlamına mı geliyor?
Abhi

9

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 - JSONveya XMLveri 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.

  • Örneğin, 10 çatal işleminin ana öğeden oluşturulduğunu varsayalım.
  • ve her işlem bir miktar işlem yapar
  • ve işlemin tamamlanmasına ilişkin her işlem, ' işlem no.4 tamamlandı ', ' işlem no.8 tamamlandı ' ana öğesine mesaj gönderir

Ebeveynten çocuğa ve son olarak bir dosyanın içinde sürekli günlük kaydı verileri ne olacak?
Esqarrouth

1
@ Esqarrouth, sürekli akış mı yoksa mesajlar mı olacağını tanımlamanız gerekir. Ve kelime "sürekli loging" i evet sonra kullanırsanız, u çocuğa günlükleri (JSON) için wrting olacağına inanıyoruz kullanılan FORKverilerin çok büyük bir yığın varsa olmak başka tamponlu sonra kullanmakSPAWN
vijay

5
  • spawn - child_process.spawn , verilen bir komutla yeni bir işlem başlatır.
  • fork - child_process.fork yöntemi, alt süreçler oluşturmak için spawn () yönteminin özel bir halidir .

Spawn () Yöntemi

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.

Fork () Yöntemi

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.