Latest web development tutorials

Node.js wieloprocesową

Wszyscy wiemy, że node.js jest tryb jednowątkowy, ale jest używany do obsługi jednoczesnych zdarzeniami, które pomogą nam stworzyć wiele podprocesów w systemie multi-core CPU, który poprawia wydajność.

Każde dziecko jest zawsze z trzech obiektów przepływu: child.stdin, child.stdout i child.stderr. Mogą dzielić strumień stdio proces macierzysty, lub może być również sterowany niezależny obiekt strumienia.

Węzeł zapewnia child_process moduły do ​​tworzenia procesu potomnego, poprzez:

  • Exec - proces potomny wykorzystanie Run child_process.execbufor wyjściowy procesu potomnego, a wyjście z procesu potomnego jest zwracany w postaci ciągu parametrów funkcji oddzwaniania.

  • tarło - child_process.spawn używając podanych parametrów wiersza polecenia, aby utworzyć nowy proces.

  • Widelec - child_process.fork jest tarło () specjalny formularz dla modułu działa u dziecka, takich jak widelcem ( "./ son.js ') odpowiada na tarło (" węzłów "[" ./son.js " ]).Różnica polega metoda tarło, widelec między procesem rodzicem a dzieckiem, ustalić kanał komunikacji do komunikacji między procesami.


Metoda exec ()

Proces potomny wykorzystanie Run child_process.exec bufor wyjściowy procesu potomnego, a wyjście z procesu potomnego jest zwracany w postaci ciągu parametrów funkcji oddzwaniania.

Składnia jest następująca:

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

parametry

Parametry są następujące:

Polecenie: String, polecenie do uruchomienia, parametry oddzielone spacjami

Opcje: obiekty mogą być:

  • Obecny CWD katalog roboczy, łańcuch, to proces potomny
  • env, przedmiot kluczowych zmiennych środowiskowych
  • kodowanie, string, kodowanie znaków (domyślnie: 'utf8')
  • shell, łańcuch, aby wykonać polecenie powłoki (domyślnie: na UNIX jest /bin/sh , jak w systemie Windows cmd.exe , Shell powinien być w stanie zidentyfikować -c przełącznika w UNIX-ie lub /s /c w systemie Windows. w systemie Windows, linia parsowanie polecenia być zgodne cmd.exe )
  • Timeout, cyfrowy, czas oczekiwania (domyślnie: 0)
  • maxBuffer, cyfrowy, maksymalna bufor stdout lub stderr mogą istnieć (binarne), więc jeśli dziecko będzie zabity poza (domyślnie: 200 * 1024)
  • killSignal sygnał końca string (domyślnie: 'SIGTERM')
  • uid, cyfrowy, ustawić identyfikator użytkownika procesu
  • GID, cyfrowy, ustaw ID grupy procesów

callback: funkcja zwrotna ma trzy argumenty błędu, stdout i stderr.

exec () zwraca maksymalną bufor, i czekać na zakończenie procesu, jednorazowa przywrócić zawartość bufora.

Przykłady

Stwórzmy dwie js pliki support.js i master.js.

support.js kod pliku:

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

master.js kod pliku:

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

Realizacja powyższego kodu, wyjście jest:

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

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

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

stderr: 

Metoda tarło ()

child_process.spawn używając podanych parametrów wiersza polecenia, aby utworzyć nowy proces, składnia jest następująca:

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

parametry

Parametry są następujące:

Polecenie: Polecenie do uruchomienia

args: parametr ciąg Array

Opis obiektu

  • Cwd String bieżący katalog roboczy procesu potomnego
  • env otoczenia obiektu par klucz-wartość zmiennej
  • stdio Array | podproces stdio konfiguracji String
  • wolnostojący Boolean To dziecko stanie się liderem grupy procesów
  • uid Ilość ustawić identyfikator użytkownika procesu
  • GID Numer ustawione ID grupy procesów

Metoda tarło () zwraca strumień (stdout i stderr) stosowany w procesie powrotu dużych ilości danych. Gdy proces rozpoczyna się, gdy grzybnia () zaczął otrzymywać odpowiedzi.

Przykłady

Stwórzmy dwie js pliki support.js i master.js.

support.js kod pliku:

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

master.js kod pliku:

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

Realizacja powyższego kodu, wyjście jest:

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

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

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

子进程已退出,退出码 0

metoda widelec

child_process.fork jest specjalną formą ikry () metoda tworzenia procesów, składnia jest następująca:

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

parametry

Parametry są następujące:

ModulePath: String, należy uruchomić w module procesu potomnego

args: parametr ciąg Array

Opcje: Przedmiot

  • Cwd String bieżący katalog roboczy procesu potomnego
  • env otoczenia obiektu par klucz-wartość zmiennej
  • execPath String utworzyć procesu potomnego pliku wykonywalnego
  • tablicy parametrów String execArgv Array dziecka plik wykonywalny (domyślnie: process.execArgv)
  • Jeśli milczy Boolean true , dziecka stdin , stdout i stderr będzie powiązana z procesu macierzystego, w przeciwnym razie będą one dziedziczone z procesu macierzystego. (Domyślnie: false )
  • uid Ilość ustawić identyfikator użytkownika procesu
  • GID Numer ustawione ID grupy procesów

Zwrócona przedmiotem oprócz wszystkich metodach stosuje się wystąpienie ChildProcess, jest wbudowany w kanał komunikacyjny.

h3> Przykłady

Stwórzmy dwie js pliki support.js i master.js.

support.js kod pliku:

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

master.js kod pliku:

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

Realizacja powyższego kodu, wyjście jest:

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