Phần 18: NodeJS – Scaling Ứng dụng – NodeJS căn bản cho người mới bắt đầu

NodeJs là nền tảng đơn luồng, nhưng được dùng để lưu trữ mô hính sự kiện để xử lý bên cạnh đó. NodeJs tạo các điều kiện để khởi tạo các chuỗi tiến trình con để thúc đẩy xử lý music music trong hệ thống CPU đa lõi
Các chuỗi tiến trình con có 3 stream chính baby.stdin, baby.stdout, và baby.stderr mà có thể được chia sẻ với stream stdio của tiến trình cha
Ngoài ra, node còn cung cấp child_process , trong đó có ba cách chính dưới đây để tạo quy trình con:
- exec − phương thức child_process.exec chạy lệnh trong shell / console và buffer đầu ra.
- spawn – khởi tạo child_process.spawn là 1 quá trình được lấy từ command
- fork – phương thức child_process.for là trường hợp đặc biệt của spawn() để tạo tiến trình con
Table of Contents
1. Phương thức exec():
Phương thức child_process.exec chạy những lệnh từ command trong Shell và buffer đầu ra, nó có dạng như dưới đây :
child_process.exec(command[, options], callback)
Các tham số :
- command (String): chạy lệnh cmd , các đối số được phân tách do khoảng trắng
- choices(Object): Bao gồm 1 hay nhiều choice sau :
- cwd (String) làm việc trực tiếp với tiến trình con
- env (Object) Các cặp key-value
- shell (String) để thực thi những lệnh (mặc định: ‘/bin/sh’ on UNIX, ‘cmd.exe’ trên Windows, shell nên được hiểu -c chuyển qua UNIX hay /s /c ở Windows. Trên Windows, cmd parsing nên tương thích cmd.exe.)
- timeout (Number) (mặc định: 0)
- maxBuffer (Number) (mặc định: 200*1024)
- killSignal (String) (mặc định: ‘SIGTERM’)
- uid (Number) nhận biết consumer trong khi chạy
- gid (Number) nhận biết group trong khi chạy
callback hàm lấy 3 đối số error, stdout, và stderr được gọi khi tiến trình kết thúc.
Hàm exec() trả về buffer với kích thước lớn nhất và đợi tới khi tiến trình kết thúc sẽ nỗ lực trả về toàn bộ những dữ liệu trong bộ đệm cùng 1 lúc
Ví dụ
Tạo 2 file js gồm : help.js và grasp.js
help.js :
console.log("Child Process " + course of.argv[2] + " executed." );
grasp.js :
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var employeeProcess = child_process.exec('node help.js '+i,perform
(error, stdout, stderr) {
if (error)
console.log(error.stack);
console.log('Error code: '+error.code);
console.log('Signal obtained: '+error.sign);
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
employeeProcess.on('exit', perform (code)
console.log('Child course of exited with exit code '+code);
);
}
Hiện tại hãy thử chạy file grasp.js :
$ node grasp.js
Kiểm tra đầu ra,server bắt đầu chạy như dưới đây :
Child course of exited with exit code 0
stdout: Child Process 1 executed.
stderr:
Child course of exited with exit code 0
stdout: Child Process 0 executed.
stderr:
Child course of exited with exit code 0
stdout: Child Process 2 executed.
2. Phương thức spawn() :
phương thức child_process.spawn khởi chạy 1 quy trình mới với 1 lệnh nhất định. Nó như dưới đây :
child_process.spawn(command[, args][, options])
Các tham số được dùng :
- command (String) chạy lệnh
- args (Array) Danh sách chuỗi các tham số
- choices (Object) có thể gồm 1 hay nhiều lựa chọn sau:cwd (String) Thư mục làm việc hiện giờ của tiến trình con.env (Object) Các cặp khóa-giá trịstdio (Array) Cấu hình stdio của String Child.customFds (Array) Bộ giới thiệu file không được chấp nhận để con sử dụng cho stdio.indifferent (Boolean) lớp con sẽ chỉ định tiến trìnhuid (Number)Đặt danh tính người sử dụng của quy trình.gid (Number) Đặt danh tính group của quy trình.
Phương thức spawn () trả về những luồng (stdout & stderr) và nó sẽ được dùng khi quá trình trả về 1 lượng lớn dữ liệu. spawn () bắt đầu nhận phản hồi ngay lúc tiến trình bắt đầu thực thi.
Ví dụ :
help.js
console.log("Child Process " + course of.argv[2] + " executed." );
grasp.js:
const fs = require('fs');
const child_process = require('child_process');
for(var i = 0; i<3; i++) {
var employeeProcess = child_process.spawn('node', ['support.js', i]);
employeeProcess.stdout.on('information', perform (information)
console.log('stdout: ' + information);
);
employeeProcess.stderr.on('information', perform (information) );
employeeProcess.on('shut', perform (code) );
}
chạy lệnh :
$ node grasp.js
Kết quả như dưới đây :
stdout: Child Process 0 executed.
baby course of exited with code 0
stdout: Child Process 1 executed.
stdout: Child Process 2 executed.
baby course of exited with code 0
baby course of exited with code 0
3. Phương thức fork():
Phương thức child_process.fork là 1 trường hợp đặc biệt của spawn () để tạo các tiến trình Node:
child_process.fork(modulePath[, args][, options])
Tham số được dùng :
- modulePath (String) Các module để chạy trong lớp con.
- args (Array) danh sách chuỗi các đối số
- choices (Object) có thể gồm 1 hay nhiều lựa chọn sau:cwd (String) Thư mục làm việc hiện giờ của tiến trình con.env (Object) các cặp key-valueexecPath (String) được dùng để tạo tiến trình con.execArgv (Array) Danh sách các đối số chuỗi được chuyển tới file thực thi (Mặc định: course of.execArgv).silent (Boolean) nếu như đúng, stdin, stdout và stderr của con sẽ được chuyển tới cha mẹ, nếu như không chúng sẽ được thừa kế từ cha mẹ, hãy xem những tùy chọn “pipe” và “inherit” cho stdio của spawn () để biết thêm chi tiết (mặc định là sai).uid (Number) Đặt danh tính người sử dụng của quy trình.gid (Number) Đặt danh tính nhóm của quy trình.
Phương thức fork trả về 1 đối tượng có kênh giao tiếp tích hợp ngoài việc có toàn bộ các phương thức trong 1 phiên bản ChildProcess bình thường
Ví dụ :
help.js
console.log("Child Process " + course of.argv[2] + " executed." );
grasp.js
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var worker_process = child_process.fork("help.js", [i]);
worker_process.on('shut', perform (code) );
}
Chạy dòng code sau :
$ node grasp.js
Kết quả như dưới đây :
Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
baby course of exited with code 0
baby course of exited with code 0
baby course of exited with code 0