Rumah  >  Artikel  >  hujung hadapan web  >  Tutorial pengenalan minimalis Nodejs (3): Process_node.js

Tutorial pengenalan minimalis Nodejs (3): Process_node.js

WBOY
WBOYasal
2016-05-16 16:32:481134semak imbas

Walaupun Node mempunyai berbilang utas, JavaScript yang dijalankan pada v8 adalah satu utas. Modul child_process Node digunakan untuk mencipta proses anak dan kami boleh menggunakan sepenuhnya CPU melalui proses anak. Contoh:

Salin kod Kod adalah seperti berikut:

var fork = memerlukan('child_process').fork;
// Dapatkan bilangan CPU mesin semasa
var cpus = memerlukan('os').cpus();
untuk (var i = 0; i < cpus.length; i ) {
// Jana proses baharu
Fork('./worker.js');
}

Berikut ialah beberapa kaedah penciptaan proses termasuk garpu:

1.spawn(command, [args], [options]), memulakan proses baharu untuk melaksanakan arahan arahan, args ialah parameter baris arahan
2.exec(arahan, [pilihan], panggil balik), memulakan proses baharu untuk melaksanakan arahan arahan, panggil balik digunakan untuk mendapatkan input standard, output standard dan maklumat ralat apabila proses tamat
3.execFile(fail, [args], [options], [panggilan balik]), memulakan proses baharu untuk melaksanakan fail fail boleh laku, panggil balik digunakan untuk mendapatkan input standard, output standard dan maklumat ralat apabila proses tamat
4.fork(modulePath, [args], [options]), memulakan proses baharu untuk melaksanakan modul fail JavaScript dan proses anak Node dibuat pada masa ini

Komunikasi antara proses nod

Proses Ibu Bapa

Salin kod Kod adalah seperti berikut:

// parent.js
var fork = memerlukan('child_process').fork;
// fork mengembalikan objek proses anak n
var n = fork('./child.js');
// Kendalikan mesej acara
n.on('message', function(m) {
// Terima mesej yang dihantar oleh proses anak
console.log('dapat mesej: ' m);
});

//Hantar mesej kepada proses anak
n.send({hello: 'world'});

Proses kanak-kanak

Salin kod Kod adalah seperti berikut:

// child.js
// Kendalikan mesej acara
process.on('message', function(m) {
console.log('dapat mesej: ' m);
});

// Terdapat kaedah hantar dalam proses, yang digunakan untuk menghantar mesej kepada proses induk
process.send({foo: 'bar'});

Perlu diingatkan bahawa kaedah penghantaran di sini adalah segerak, jadi tidak disyorkan untuk menghantar sejumlah besar data (anda boleh menggunakan paip sebaliknya, lihat untuk butiran: http://nodejs.org/api/ semua. html#process_child_process_spawn_command_args_options).
Dalam kes khas, jika nilai atribut cmd dalam mesej mengandungi awalan NODE_ (contohnya: {cmd: 'NODE_foo'} mesej), maka mesej ini tidak akan diserahkan kepada acara mesej (tetapi acara internalMessage), dan mereka digunakan secara dalaman oleh Node.

Prototaip

kaedah hantar ialah:

Salin kod Kod adalah seperti berikut:

hantar(mesej, [sendHandle])

Di sini, sendHandle(handle) boleh digunakan untuk menghantar:

1.net.Soket atau paip TCP C asli, asli
2.net.Server, pelayan TCP
3.net.Soket, soket TCP
4.dgram.Soket C UDP asli, asli
5.dgram.Soket, soket UDP

Apabila hantar menghantar sendHandle, ia sebenarnya tidak (dan tidak boleh) menghantar objek JavaScript secara langsung, tetapi menghantar deskriptor fail (akhirnya dihantar sebagai rentetan JSON Proses lain boleh menggunakan deskriptor fail ini untuk memulihkan objek yang sepadan).

Sekarang lihat contoh:

Proses Ibu Bapa

Salin kod Kod adalah seperti berikut:

// parent.js
var fork = memerlukan('child_process').fork;

var n = fork('./child.js');

pelayan var = memerlukan('net').createServer();
server.listen(7000, function() {
//Hantar pelayan TCP ke proses anak
n.send('server', server);
}).on('sambungan', function() {
console.log('sambungan - ibu bapa');
});

Proses kanak-kanak

Salin kod Kod adalah seperti berikut:

process.on('message', function(m, h) {
Jika (m === 'pelayan') {
          h.on('connection', function() {
console.log('sambungan - anak');
});
}
});

Akses program ini melalui port 7000, dan output mungkin sambungan – ibu bapa atau sambungan – anak. Di sini proses anak dan proses induk sedang mendengar pada port 7000 pada masa yang sama. Secara umumnya, berbilang proses mendengar port yang sama akan menyebabkan pengecualian EADDRINUSE Dalam kes ini, dua proses berbeza menggunakan deskriptor fail yang sama, dan lapisan bawah Node menetapkan pilihan SO_REUSEADDR pada soket apabila mendengar pada port membenarkan soket ini digunakan semula antara proses yang berbeza. Apabila berbilang proses mendengar port yang sama, deskriptor fail hanya boleh digunakan oleh satu proses pada masa yang sama, dan penggunaan soket oleh proses ini adalah preemptive.

modul kluster

Modul kluster telah ditambahkan dalam Node v0.8 Melalui modul kluster, anda boleh membina sekumpulan proses mendengar port yang sama pada mesin fizikal. Contoh:

Salin kod Kod adalah seperti berikut:

var cluster = memerlukan('cluster');
var http = memerlukan('http');
var numCPUs = memerlukan('os').cpus().panjang;

// Semak sama ada proses itu adalah proses induk
jika (cluster.isMaster) {
untuk (var i = 0; i < numCPUs; i)
// Hasilkan proses pekerja baharu (hanya proses induk boleh dipanggil)
        cluster.fork();

cluster.on('keluar', fungsi(pekerja, kod, isyarat) {
console.log('pekerja ' pekerja.proses.pid ' meninggal dunia');
});
} lain {
http.createServer(function(req, res) {
           res.writeHead(200);
          res.end('hello worldn');
}).dengar(8000);
}

Kami memanggil kaedah mendengar dalam proses pekerja, dan permintaan mendengar akan dihantar kepada proses induk. Jika proses induk sudah mempunyai pelayan mendengar yang memenuhi keperluan proses pekerja, maka pemegang pelayan ini akan diserahkan kepada pekerja Jika ia tidak wujud, proses induk akan mencipta satu dan kemudian menyerahkan pemegang kepada proses pekerja.

Dokumentasi yang lebih terperinci tentang kelompok: http://www.nodejs.org/api/cluster.html

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn