Node.js - aplikacja skalująca

Node.js działa w trybie jednowątkowym, ale używa paradygmatu sterowanego zdarzeniami do obsługi współbieżności. Ułatwia również tworzenie procesów potomnych w celu wykorzystania przetwarzania równoległego w systemach z wielordzeniowymi procesorami.

Procesy potomne zawsze mają trzy strumienie child.stdin, child.stdout, i child.stderr które mogą być współdzielone ze strumieniami stdio procesu nadrzędnego.

Node zapewnia child_process moduł, który ma następujące trzy główne sposoby tworzenia procesu potomnego.

  • exec - metoda child_process.exec uruchamia polecenie w powłoce / konsoli i buforuje dane wyjściowe.

  • spawn - child_process.spawn uruchamia nowy proces z podanym poleceniem.

  • fork - Metoda child_process.fork jest specjalnym przypadkiem metody spawn () do tworzenia procesów potomnych.

Metoda exec ()

child_process.exec uruchamia polecenie w powłoce i buforuje dane wyjściowe. Ma następujący podpis -

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

Parametry

Oto opis użytych parametrów -

  • command (String) Polecenie do uruchomienia z argumentami oddzielonymi spacjami

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego

    • env (Obiekt) Pary klucz-wartość środowiska

    • encoding (Ciąg) (domyślnie: „utf8”)

    • shell (Ciąg) Powłoka do wykonania polecenia z (Domyślnie: „/ bin / sh” w systemie UNIX, „cmd.exe” w systemie Windows) Powłoka powinna rozumieć przełącznik -c w systemie UNIX lub / s / c w systemie Windows. parsowanie wiersza poleceń powinno być zgodne z cmd.exe).

    • timeout (Liczba) (domyślnie: 0)

    • maxBuffer (Liczba) (domyślnie: 200 * 1024)

    • killSignal (Ciąg) (Domyślnie: „SIGTERM”)

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

  • callback Funkcja pobiera trzy argumenty error, stdout, i stderr które są wywoływane wraz z wyjściem po zakończeniu procesu.

Metoda exec () zwraca bufor o maksymalnym rozmiarze i czeka na zakończenie procesu i próbuje jednocześnie zwrócić wszystkie zbuforowane dane.

Przykład

Utwórzmy dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('Child process exited with exit code '+code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

Metoda spawn ()

child_process.spawn uruchamia nowy proces z podanym poleceniem. Ma następujący podpis -

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

Parametry

Oto opis użytych parametrów -

  • command (Ciąg) Polecenie do uruchomienia

  • args (Tablica) Lista argumentów łańcuchowych

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego.

    • env (Obiekt) Pary klucz-wartość środowiska.

    • stdio (Array) String Konfiguracja stdio dziecka.

    • customFds (Tablica) Przestarzałe Deskryptory plików, których dziecko ma używać w stdio.

    • detached (Boolean) Dziecko będzie liderem grupy procesów.

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

Metoda spawn () zwraca strumienie (stdout & stderr) i powinna być używana, gdy proces zwraca objętość danych. spawn () zaczyna otrzymywać odpowiedź zaraz po rozpoczęciu wykonywania procesu.

Przykład

Utwórz dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('child process exited with code ' + code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Metoda fork ()

metoda child_process.fork jest specjalnym przypadkiem funkcji spawn () do tworzenia procesów węzła. Ma następujący podpis -

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

Parametry

Oto opis użytych parametrów -

  • modulePath (String) Moduł do uruchomienia w elemencie potomnym.

  • args (Tablica) Lista argumentów łańcuchowych

  • options (Obiekt) może obejmować jedną lub więcej z następujących opcji -

    • cwd (String) Bieżący katalog roboczy procesu potomnego.

    • env (Obiekt) Pary klucz-wartość środowiska.

    • execPath (String) Plik wykonywalny używany do tworzenia procesu potomnego.

    • execArgv (Tablica) Lista argumentów łańcuchowych przekazanych do pliku wykonywalnego (domyślnie: process.execArgv).

    • silent (Boolean) Jeśli true, stdin, stdout i stderr dziecka zostaną przesłane potokiem do rodzica, w przeciwnym razie zostaną odziedziczone od rodzica, zobacz opcje "pipe" i "inherit" dla stdio spawn (), aby uzyskać więcej informacji szczegóły (wartość domyślna to fałsz).

    • uid (Liczba) Ustawia tożsamość użytkownika procesu.

    • gid (Liczba) Ustawia tożsamość grupy procesu.

Metoda fork zwraca obiekt z wbudowanym kanałem komunikacyjnym oprócz wszystkich metod w normalnej instancji ChildProcess.

Przykład

Utwórz dwa pliki js o nazwach support.js i master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: 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('child process exited with code ' + code);
   });
}

Teraz uruchom plik master.js, aby zobaczyć wynik -

$ node master.js

Sprawdź dane wyjściowe. Serwer został uruchomiony.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0