Node.js berbilang proses
Kita semua tahu bahawa Node.js berjalan dalam mod satu benang, tetapi ia menggunakan dipacu peristiwa untuk mengendalikan serentak, yang membantu kami mencipta berbilang proses anak pada sistem CPU berbilang teras, dengan itu meningkatkan prestasi.
Setiap proses kanak-kanak sentiasa mempunyai tiga objek aliran: child.stdin, child.stdout dan child.stderr. Mereka mungkin berkongsi strim stdio proses induk, atau mereka mungkin objek strim diubah hala bebas.
Node menyediakan modul child_process untuk mencipta proses anak Kaedahnya ialah:
exec - child_process.exec menggunakan proses anak untuk melaksanakan. perintah dan cache proses anak Output proses dan mengembalikan output proses anak dalam bentuk parameter fungsi panggil balik.
spawn - child_process.spawn mencipta proses baharu menggunakan argumen baris arahan yang ditentukan.
fork - child_process.fork ialah bentuk khas spawn(), digunakan untuk modul yang dijalankan dalam proses anak, seperti fork('./son.js ') adalah bersamaan dengan spawn('node', ['./son.js']) . Berbeza dengan kaedah spawn, fork akan mewujudkan saluran komunikasi antara proses induk dan proses anak untuk komunikasi antara proses.
kaedah exec()
child_process.exec menggunakan proses anak untuk melaksanakan arahan, menyimpan cache output proses anak dan menggunakan output daripada proses anak sebagai parameter fungsi panggil balik kembali dalam bentuk.
Sintaks adalah seperti berikut:
child_process.exec(command[, options], callback)
Parameter
Penerangan parameter adalah seperti berikut:
perintah: rentetan, perintah untuk dijalankan , parameter dipisahkan oleh ruang
pilihan: objek, boleh menjadi:
cwd, rentetan, direktori kerja semasa bagi proses anak
env, pasangan nilai kunci pembolehubah persekitaran objek
pengekodan, rentetan, pengekodan aksara (lalai: 'utf8')
shell, rentetan, Shell yang akan melaksanakan arahan (lalai:
/bin/sh
dalam UNIX,cmd.exe
dalam Windows, shell seharusnya dapat mengenali suis-c
dalam UNIX , atau/s /c
Dalam Windows. Dalam Windows, penghuraian baris arahan hendaklah serasicmd.exe
)masa tamat, nombor, tamat masa (lalai: 0) >
maxBuffer, nombor , penimbal maksimum (perduaan) dibenarkan dalam stdout atau stderr, jika melebihi proses anak akan dimatikan (lalai: 200*1024)- killSignal, rentetan, isyarat tamat (lalai: ' SIGTERM')
- uid, nombor, tetapkan ID proses pengguna
- gid, Nombor, tetapkan ID proses kumpulan
- panggilan balik:
Kaedah exec() mengembalikan penimbal terbesar, menunggu proses tamat dan mengembalikan kandungan penimbal sekaligus.
ContohMari kita cipta dua fail js support.js dan master.js. kod fail support.js:console.log("进程 " + process.argv[2] + " 执行。" );kod fail master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); console.log('Signal received: '+error.signal); } console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); }); workerProcess.on('exit', function (code) { console.log('子进程已退出,退出码 '+code); }); }Laksanakan kod di atas, hasil output ialah:
$ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
kaedah spawn()
child_process.spawn menggunakan parameter baris arahan yang ditentukan untuk mencipta proses baharu Format sintaks adalah seperti berikut:
child_process.spawn(command[, args][, options])
Parameter
.Penerangan Parameter Seperti berikut:
arahan: Perintah untuk dijalankan
args: Tatasusunan parameter rentetan
options Object
cwd String Direktori kerja semasa proses anak
env Object environment variable key-value pasangan
stdio Array|String stdio konfigurasi proses anak
Boolean tertanggal Proses anak ini akan menjadi ketua kumpulan proses
uid Number Tetapkan ID proses pengguna
gid Number Tetapkan ID kumpulan proses
Kaedah spawn() mengembalikan strim (stdout & stderr), Digunakan apabila proses mengembalikan sejumlah besar data. spawn() mula menerima respons sebaik sahaja proses mula dilaksanakan.
Contoh
Mari kita cipta dua fail js support.js dan master.js.
kod fail support.js:
console.log("进程 " + process.argv[2] + " 执行。" );
kod fail master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn('node', ['support.js', i]); workerProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); workerProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
Laksanakan kod di atas, hasil output ialah:
$ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0
Kaedah fork
child_process.fork ialah bentuk khas kaedah spawn(), yang digunakan untuk mencipta proses Format sintaks adalah seperti berikut:
child_process.fork(modulePath[, args][, options])
Parameter
<. 🎜>Penerangan parameter adalah seperti berikut:
modulePath: Rentetan, modul yang akan dijalankan dalam proses anak
args: Rentetan tatasusunan tatasusunan parameter
pilihan : Objek
- cwd String Direktori kerja semasa proses anak
- env Object environment variable key-value pair
- execPath String Cipta fail boleh laku proses anak
- execArgv Array Tatasusunan parameter rentetan bagi fail boleh laku proses anak (lalai: process.execArgv)
- senyap Boolean Jika
, proses anak
true
,stdin
danstdout
akan dikaitkan dengan proses induk, jika tidak, mereka akan diwarisi daripada proses induk. (Lalai:stderr
)false
- Uid Number Tetapkan ID proses pengguna
- gid Number Tetapkan ID kumpulan proses
h3>Contoh
Mari kita buat dua fail js support.js dan master.js. kod fail support.js:console.log("进程 " + process.argv[2] + " 执行。" );kod fail master.js:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("support.js", [i]); worker_process.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }Laksanakan kod di atas, hasil output ialah:
$ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0