Node memiliki banyak utas, tetapi JavaScript yang berjalan di V8 berulir tunggal. Modul Child_Process Node digunakan untuk membuat proses anak, dan kami dapat memanfaatkan CPU secara penuh melalui proses anak. contoh:
Salinan kode adalah sebagai berikut:
var fork = membutuhkan ('child_process'). fork;
// Dapatkan nomor CPU dari mesin saat ini
var cpus = membutuhkan ('os'). cpus ();
untuk (var i = 0; i <cpus.length; i ++) {
// menghasilkan proses baru
fork ('./ worker.js');
}
Berikut adalah beberapa cara untuk membuat proses termasuk fork:
1.spawn (perintah, [args], [opsi]), mulai proses baru untuk menjalankan perintah perintah, args adalah parameter baris perintah
2. EXEC (Command, [Options], Callback), Mulai proses baru untuk menjalankan perintah perintah, callback digunakan untuk mendapatkan input standar, output standar, dan informasi kesalahan pada akhir proses.
3.Execfile (file, [args], [opsi], [callback]), memulai proses baru untuk menjalankan file yang dapat dieksekusi. Callback digunakan untuk mendapatkan input standar, output standar, dan informasi kesalahan pada akhir proses.
4.Fork (ModulePath, [args], [Options]), Mulailah proses baru untuk menjalankan modul file JavaScript, dan proses anak node dibuat saat ini.
Komunikasi interproses simpul
Proses induk
Salinan kode adalah sebagai berikut:
// Parent.js
var fork = membutuhkan ('child_process'). fork;
// garpu mengembalikan objek proses anak n
var n = fork ('./ Child.js');
// Tangani pesan acara
n.on ('pesan', fungsi (m) {
// menerima pesan yang dikirim oleh proses anak
console.log ('Got pesan:' + m);
});
// Kirim pesan ke proses anak
n.send ({hello: 'world'});
Subproses
Salinan kode adalah sebagai berikut:
// Child.js
// Tangani pesan acara
Process.on ('Message', function (m) {
console.log ('Got pesan:' + m);
});
// Metode Kirim ada untuk mengirim pesan ke proses induk.
process.send ({foo: 'bar'});
Perlu dicatat bahwa metode Kirim di sini sinkron, sehingga tidak disarankan untuk mengirim sejumlah besar data (Anda dapat menggunakan pipa sebagai gantinya, lihat http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_options untuk detail).
Dalam kasus khusus, nilai atribut CMD dalam pesan berisi awalan node_ (misalnya: {cmd: 'node_foo'} pesan), maka pesan ini tidak akan dikirimkan ke acara pesan (tetapi acara internalmessage), dan mereka digunakan secara internal oleh node.
Prototipe metode kirim adalah:
Salinan kode adalah sebagai berikut:
Kirim (pesan, [SendHandle])
Di sini, SendHandle (pegangan) dapat digunakan untuk mengirim:
1.Net.native, soket atau pipa TCP asli C ++
2.NET.SERVER, Server TCP
3.Net.socket, soket TCP
4.dgram.native, soket C ++ UDP asli
5.dgram.socket, soket UDP
Kirim Saat mengirim SendHandle, itu bukan (dan tidak bisa) untuk secara langsung mengirim objek JavaScript, tetapi untuk mengirim deskriptor file (akhirnya dikirim sebagai string JSON). Proses lain dapat mengembalikan objek yang sesuai melalui deskriptor file ini.
Sekarang lihatlah sebuah contoh:
Proses induk
Salinan kode adalah sebagai berikut:
// Parent.js
var fork = membutuhkan ('child_process'). fork;
var n = fork ('./ Child.js');
var server = membutuhkan ('net'). createServer ();
server.listen (7000, function () {
// Kirim server TCP ke proses anak
n.send ('server', server);
}). on ('connection', function () {
console.log ('koneksi - induk');
});
Subproses
Salinan kode adalah sebagai berikut:
process.on ('pesan', fungsi (m, h) {
if (m === 'server') {
h.on ('connection', function () {
console.log ('koneksi - anak');
});
}
});
Mengakses program ini melalui port 7000 dapat menghasilkan output sebagai induk koneksi atau anak koneksi. Di sini, proses anak dan proses orang tua mendengarkan Port 7000 secara bersamaan. Secara umum, banyak proses yang mendengarkan port yang sama akan menyebabkan pengecualian eaddrinuse. Dalam hal ini, dua proses yang berbeda menggunakan deskriptor file yang sama, dan lapisan yang mendasari node mengatur opsi SO_REUSEADDR pada soket saat mendengarkan port, yang memungkinkan soket ini digunakan kembali di antara proses yang berbeda. Ketika beberapa proses mendengarkan port yang sama, deskriptor file hanya dapat digunakan oleh satu proses secara bersamaan, dan proses ini menggunakan soket secara lebih baik.
modul cluster
Modul cluster baru telah ditambahkan ke v0.8 di simpul, di mana modul cluster dapat dengan mudah membangun sekelompok proses yang mendengarkan port yang sama pada mesin fisik. contoh:
Salinan kode adalah sebagai berikut:
var cluster = membutuhkan ('cluster');
var http = membutuhkan ('http');
var numcpus = membutuhkan ('os'). cpus (). panjang;
// Periksa apakah prosesnya adalah proses master
if (cluster.ismaster) {
untuk (var i = 0; i <numcpus; ++ i)
// menghasilkan proses pekerja baru (hanya proses master yang dapat dipanggil)
cluster.fork ();
cluster.on ('keluar', fungsi (pekerja, kode, sinyal) {
console.log ('pekerja' + worker.process.pid + 'die');
});
} kalau tidak {
http.createServer (function (req, res) {
res.writeHead (200);
res.end ('halo dunia/n');
}). Dengarkan (8000);
}
Kami memanggil metode mendengarkan dalam proses pekerja, dan permintaan mendengarkan akan diteruskan ke proses master. Jika proses master sudah memiliki server yang mendengarkan untuk memenuhi persyaratan proses pekerja, pegangan server ini akan diteruskan ke pekerja. Jika tidak ada, proses master akan membuat satu dan kemudian meneruskan pegangan ke proses pekerja.
Dokumentasi lebih rinci tentang cluster: http://www.nodejs.org/api/cluster.html