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?
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.
@ 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 '
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 -
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.
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?TLDR
Ketika spawn dibuat - Ini menciptakan antarmuka streaming antara proses induk dan anak.
sarana antarmuka streaming - buffering data dalam format biner di
ONE TIME
Ketika garpu dibuat - Ini menciptakan saluran komunikasi antara proses induk dan anak
saluran komunikasi berarti - olahpesan
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 di
ONE TIME
garpu akan berguna ketika Anda ingin melakukan olahpesan misalnya -
JSON
atauXML
pesan dataspawn harus digunakan untuk streaming data besar / file / gambar DARI proses spawn KE proses induk
garpu harus digunakan untuk melakukan pengiriman pesan Json / Xml.
sumber
FORK
lain jika Anda memiliki data yang sangat besar yang akan BUFFER kemudian gunakanSPAWN
Metode spawn ()
Metode child_process.spawn meluncurkan proses baru dengan perintah yang diberikan. Ini memiliki tanda tangan berikut -
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 -
Metode garpu mengembalikan objek dengan saluran komunikasi built-in selain memiliki semua metode dalam instance ChildProcess normal.
sumber