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 Windowscmd.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ć zgodnecmd.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
, dzieckastdin
,stdout
istderr
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ładyStwó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