proses anak node.js - perbedaan antara spawn & fork

141

Ini mungkin tampak seperti pertanyaan mendasar, tetapi saya tidak dapat menemukan dokumentasi apa pun:

Apa perbedaan antara proses forking & spawning node.js? Saya telah membaca bahwa percabangan adalah kasus khusus pemijahan, tetapi apa perbedaan kasus penggunaan / reaksi untuk menggunakan masing-masing?

Hitesh
sumber

Jawaban:

215

Spawn adalah perintah yang dirancang untuk menjalankan perintah sistem. Ketika Anda menjalankan spawn, Anda mengirimkannya perintah sistem yang akan dijalankan pada prosesnya sendiri, tetapi tidak menjalankan kode lebih lanjut dalam proses simpul Anda. Anda dapat menambahkan pendengar untuk proses yang Anda buat, untuk memungkinkan kode Anda berinteraksi dengan proses menelurkan, tetapi tidak ada instance V8 baru dibuat (kecuali tentu saja perintah Anda adalah perintah Node lain, tetapi dalam hal ini Anda harus menggunakan garpu!) Dan hanya satu salinan modul simpul Anda yang aktif pada prosesor.

Fork adalah turunan khusus dari spawn, yang menjalankan turunan baru dari mesin V8. Artinya, Anda pada dasarnya dapat membuat beberapa pekerja, berjalan pada basis kode Node yang sama persis, atau mungkin modul yang berbeda untuk tugas tertentu. Ini paling berguna untuk membuat kumpulan pekerja. Sementara model peristiwa async node memungkinkan satu inti mesin digunakan secara efisien, itu tidak memungkinkan proses simpul untuk menggunakan mesin multi-inti. Cara termudah untuk mencapai ini adalah dengan menjalankan banyak salinan dari program yang sama, pada satu prosesor.

Aturan praktis yang baik adalah proses simpul satu hingga dua per inti, mungkin lebih untuk mesin dengan rasio jam ram / cpu clock yang baik, atau untuk proses simpul yang berat pada I / O dan lampu pada kerja CPU, untuk meminimalkan waktu henti acara loop sedang menunggu acara baru. Namun, saran yang terakhir adalah optimasi mikro, dan akan membutuhkan pembandingan yang cermat untuk memastikan situasi Anda sesuai dengan kebutuhan akan banyak proses / inti. Anda benar-benar dapat menurunkan kinerja dengan menelurkan terlalu banyak pekerja untuk mesin / skenario Anda.

Pada akhirnya Anda dapat menggunakan spawn dengan cara yang melakukan hal di atas, dengan mengirim spawn perintah Node. Tapi ini akan konyol, karena garpu melakukan beberapa hal untuk mengoptimalkan proses pembuatan instance V8. Hanya membuatnya jelas, yang pada akhirnya muncul meliputi pertigaan. Fork hanya optimal untuk kasus penggunaan khusus ini, dan sangat berguna.

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

ChrisCM
sumber
@ ChrisCM, jika saya menggunakan katakanlah var child = require('child_process').fork('child.js');misalnya pada aplikasi utama saya, sekarang saya akan memiliki 2 core yang terpisah berjalan. Jika saya menjalankan heavy untuk loop di child.js (proses), pada dasarnya saya akan menggunakan lebih banyak core untuk memperkuat child.js, kan? Akankah penggunaan CPU mempengaruhi inti aplikasi utama saya?
NiCk Newman
2
Tidak mungkin melakukan apa pun pada CPU tanpa memengaruhi hal-hal lain. Penjadwalan, penggunaan cache bersama, lalu lintas BUS, dll. Namun, itu harus mengambil keuntungan dari inti yang terpisah, dan meninggalkan loop menjalankan utama Anda PALING tidak terpengaruh. Seperti pada, bukan efek negatif parah yang Anda harapkan memiliki dua proses yang berjalan pada prosesor inti tunggal yang sama. Pada titik ini, tergantung pada sistem operasi dan pengaturan perangkat keras untuk mengoptimalkan dengan benar. Pengaturan yang berbeda dapat menghasilkan hasil yang berbeda pula.
ChrisCM
@ ChrisCM Ya, saya menggunakan MonsterLoop global untuk menyinkronkan penentuan posisi monster dan objek yang diulangnya bisa sebanyak 5.000 kunci. Saya mengulanginya setiap 2 detik dan sepertinya itu memotong ratusan penggunaan memori dari CPU saya (main game satu). Saya lebih suka melakukannya dengan cara ini daripada mengelompokkan loop itu dan membuatnya menjalankan jumlah xx kali per inti yang saya miliki ... Ty untuk wawasan Anda ~ Sekarang saya tidak tahu apakah saya harus menggunakan Redis atau IPC internal: P
NiCk Newman
2
Terima kasih telah membahas "mengapa" - semua posting yang saya baca sampai yang satu ini melewatkan bagian penjelasan yang sederhana.
aaaaaa
@ ChrisCM Dalam jawaban Anda "..tapi tidak menjalankan kode lebih lanjut dalam proses simpul Anda ..". Apakah ini berarti utas utama sedang menunggu dan tidak memproses apa-apa .. Jika YA maka apa gunanya menggunakan bibit di sini ..?
Abhi
9

TLDR

Spawn

Ketika spawn dibuat - Ini menciptakan antarmuka streaming antara proses induk dan anak.

sarana antarmuka streaming - buffering data dalam format biner diONE TIME

Fork

Ketika garpu dibuat - Ini menciptakan saluran komunikasi antara proses induk dan anak

saluran komunikasi berarti - olahpesan

Difference

Baik keduanya terlihat jenis melakukan transfer data yang sama , Kecuali perbedaannya di bawah

spawn akan berguna ketika Anda ingin melakukan buffer data kontinu dalam format biner / encoding , Misalnya - Transfer file video 1gb, gambar, file log diONE TIME

garpu akan berguna ketika Anda ingin melakukan olahpesan misalnya - JSONatau XMLpesan data

Conslusion

spawn harus digunakan untuk streaming data besar / file / gambar DARI proses spawn KE proses induk

garpu harus digunakan untuk melakukan pengiriman pesan Json / Xml.

  • Misalkan proses 10 fork dibuat dari orangtua.
  • dan setiap proses melakukan beberapa operasi
  • dan setiap proses penyelesaian operasi akan mengirim pesan ke induk ' proses no.4 selesai ', ' proses no.8 selesai '
vijay
sumber
Bagaimana dengan pencatatan terus menerus data dari orang tua ke anak dan akhirnya di dalam file?
Esqarrouth
1
@Esqarrouth, Anda perlu mengidentifikasi apakah itu aliran berkelanjutan atau pesan. Dan Anda menggunakan kata "pencatatan terus menerus" saya yakin Anda akan menulis ke JSON untuk anak, Jika ya maka gunakan yang FORKlain jika Anda memiliki data yang sangat besar yang akan BUFFER kemudian gunakanSPAWN
vijay
5
  • spawn - child_process.spawn meluncurkan proses baru dengan perintah yang diberikan.
  • fork - Metode child_process.fork adalah kasus khusus dari spawn () untuk membuat proses anak.

Metode spawn ()

Metode child_process.spawn meluncurkan proses baru dengan perintah yang diberikan. Ini memiliki tanda tangan berikut -

child_process.spawn(command[, args][, options])

Baca lebih lanjut tentang opsi

Metode spawn () mengembalikan aliran (stdout & stderr) dan itu harus digunakan ketika proses mengembalikan jumlah volume data. spawn () mulai menerima respons segera setelah proses mulai dijalankan.

Metode garpu ()

Metode child_process.fork adalah kasus khusus spawn () untuk membuat proses Node. Ini memiliki tanda tangan berikut -

 child_process.fork(modulePath[, args][, options])

Metode garpu mengembalikan objek dengan saluran komunikasi built-in selain memiliki semua metode dalam instance ChildProcess normal.

Igor Litvinovich
sumber