Latest web development tutorials

Node.js multi-proses

Kita semua tahu bahwa Node.js adalah mode single-threaded, tetapi digunakan untuk menangani bersamaan-event, yang akan membantu kami membuat beberapa sub-proses pada sistem cpu multi-core, yang meningkatkan kinerja.

Setiap anak selalu dengan tiga benda aliran: child.stdin, child.stdout dan child.stderr. Mereka dapat berbagi proses induk aliran stdio, atau juga dapat dikemudikan sungai objek independen.

Node menyediakan modul child_process untuk membuat proses anak, oleh:

  • exec - proses anak menggunakan Run child_process.exec,proses anak output buffer, dan output dari proses anak dikembalikan dalam bentuk parameter fungsi callback.

  • menelurkan - child_process.spawn menggunakan parameter baris perintah yang ditentukan untuk membuat proses baru.

  • garpu - child_process.fork yang menelurkan () bentuk khusus untuk modul berjalan pada anak, seperti garpu ( './ son.js') sesuai untuk bertelur ( 'simpul', [ ' ./son.js' ]).Perbedaannya adalah metode bertelur, garpu di antara proses induk dan anak, membangun saluran komunikasi untuk komunikasi antara proses.


exec () metode

proses anak menggunakan Run child_process.exec, proses anak output buffer, dan output dari proses anak dikembalikan dalam bentuk parameter fungsi callback.

Sintaksnya adalah sebagai berikut:

child_process.exec(command[, options], callback)

parameter

Parameter adalah sebagai berikut:

perintah: String, perintah untuk menjalankan, parameter dipisahkan dengan spasi

Pilihan: benda dapat:

  • Direktori kerja saat cwd, string, proses anak
  • env, objek dari variabel-variabel lingkungan utama
  • encoding, string, karakter encoding (default: 'utf8')
  • shell, string, untuk menjalankan perintah Shell (default: UNIX adalah /bin/sh , seperti di Windows cmd.exe , Shell harus dapat mengidentifikasi -c switch UNIX, atau /s /c di Windows. di Windows, baris perintah parsing kompatibel cmd.exe )
  • timeout, digital, timeout (default: 0)
  • maxBuffer, digital, buffer maksimum di stdout atau stderr diperbolehkan ada (biner), sehingga jika anak akan dibunuh di luar (default: 200 * 1024)
  • killSignal, tali akhir sinyal (default: 'SIGTERM')
  • uid, digital, mengatur ID pengguna dari proses
  • gid, digital, mengatur proses kelompok ID

callback: fungsi callback memiliki tiga argumen kesalahan, stdout dan stderr.

exec () metode mengembalikan buffer maksimum, dan menunggu akhir dari proses, satu kali kembali isi buffer.

contoh

Mari kita membuat dua js file support.js dan master.js.

support.js file kode:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js file kode:

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);
   });
}

Pelaksanaan kode di atas, output adalah:

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr: 

bibit () metode

child_process.spawn menggunakan parameter baris perintah yang ditentukan untuk membuat proses baru, sintaks adalah sebagai berikut:

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

parameter

Parameter adalah sebagai berikut:

perintah: perintah untuk menjalankan

args: Array parameter array string

Pilihan Obyek

  • Cwd String direktori saat kerja dari proses anak
  • env lingkungan Obyek variabel pasangan kunci-nilai
  • stdio Array | stdio konfigurasi String subproses
  • Boolean terpisah Anak ini akan menjadi pemimpin kelompok proses
  • uid Nomor untuk mengatur ID pengguna dari proses
  • gid Nomor mengatur proses kelompok ID

Metode bibit () mengembalikan aliran (stdout & stderr), yang digunakan dalam proses untuk kembali sejumlah besar data. Setelah proses dimulai ketika bibit () mulai menerima tanggapan.

contoh

Mari kita membuat dua js file support.js dan master.js.

support.js file kode:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js file kode:

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);
   });
}

Pelaksanaan kode di atas, output adalah:

$ node master.js stdout: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

metode garpu

child_process.fork adalah bentuk khusus dari bibit () metode untuk menciptakan proses, sintaks adalah sebagai berikut:

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

parameter

Parameter adalah sebagai berikut:

modulePath: String, yang akan dijalankan dalam modul proses anak

args: Array parameter array string

Pilihan: Object

  • Cwd String direktori saat kerja dari proses anak
  • env lingkungan Obyek variabel pasangan kunci-nilai
  • execPath String membuat proses anak dari file executable
  • file executable (default: process.execArgv) parameter array string execArgv Array anak
  • Jika Boolean diam true , anak stdin , stdout dan stderr akan terkait dengan proses induk, jika tidak, mereka akan diwarisi dari proses induk. (Default: false )
  • uid Nomor untuk mengatur ID pengguna dari proses
  • gid Nomor mengatur proses kelompok ID

objek kembali di samping semua metode memiliki ChildProcess contoh, ada sebuah saluran komunikasi built-in.

h3> Contoh

Mari kita membuat dua js file support.js dan master.js.

support.js file kode:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js file kode:

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);
   });
}

Pelaksanaan kode di atas, output adalah:

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0