Tiếp tục theo dõi nội dung dưới đây để hiểu rõ hơn về Node.js - Mở Rộng Khả Năng.
Node.js - Mở Rộng Khả Năng
1. Khái quát về Node.js
2. Sử dụng phương thức exec() trong Node.js
3. Sử dụng phương thức spawn() trong Node.js
4. Sử dụng phương thức fork() trong Node.js
1. Khái quát về Node.js
Node.js thực thi trong môi trường đơn luồng nhưng sử dụng mô hình lập trình hướng sự kiện để xử lý bất đồng bộ, cho phép tạo ra các tiến trình con để tận dụng các CPU đa nhân.
Các tiến trình con có 3 luồng là child.stdin, child.stdout và child.stderr, có thể chia sẻ với luồng stdio của tiến trình cha.
Node cung cấp module child_process sau để tạo các tiến trình con:
- exec: phương thức child_process.exec thực thi một lệnh trong shell/console và trả về kết quả dưới dạng buffer.
- spawn: phương thức child_process.spawn bắt đầu một tiến trình mới với lệnh được cung cấp.
- fork: phương thức child_process.fork là một biến thể của spawn() dùng để tạo các tiến trình con.
2. Phương thức exec() trong Node.js
Phương thức child_process.exec thực hiện một lệnh trong shell và trả về kết quả dưới dạng buffer. Dưới đây là cú pháp sử dụng:
child_process.exec(command[, options], callback)
Dưới đây là ý nghĩa của các tham số:
- command (chuỗi) là lệnh cần thực thi, với các tham số được phân tách bằng dấu cách.
- options (đối tượng) có thể chứa một hoặc nhiều tùy chọn sau đây:
+ cwd (chuỗi): thư mục làm việc hiện tại của tiến trình con.
+ env (đối tượng): đôi key - value Môi trường.
+ encoding (chuỗi) (mặc định: 'utf8').
+ shell (chuỗi): Môi trường thực thi lệnh, với '/bin/sh' là mặc định trên UNIX, 'cmd.exe' trên Windows. Shell sẽ hiểu các lệnh chuyển đổi -c trên UNIX hoặc /s/c trên Windows. Trên Windows, cú pháp dòng lệnh phải tương thích với cmd.exe.
+ timeout (số) (mặc định: 0).
+ maxBuffer (Số) (mặc định: 200 * 1024).
+ killSignal (chuỗi) (mặc định: 'SIGTERM').
+ uid (số): đặt nhận dạng người dùng của quá trình.
+ gid (số): thiết lập nhận dạng nhóm của quá trình.
- Callback: hàm này sẽ nhận 3 đối số là lỗi, stdout, và stderr, và được gọi với đầu ra khi quá trình kết thúc.
Phương thức exec() trả về một buffer với kích thước tối đa và chờ quá trình kết thúc trước khi cố gắng trả về tất cả dữ liệu buffer cùng một lúc.
Ví dụ
Tạo 2 tệp js với tên lần lượt là support.js và master.js:
Tệp: support.js:
console.log('Quá trình Con ' + process.argv[2] + ' đã được thực thi.' );
Tệp: 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('Mã lỗi: '+error.code);
console.log('Tín hiệu nhận được: '+error.signal);
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
workerProcess.on('exit', function (code) {
console.log('Tiến trình con đã kết thúc với mã thoát '+code);
});
}
Sau đó, chạy file master.js để xem kết quả:
node master.js
Xác nhận đầu ra, máy chủ đã được khởi động.
Tiến trình con đã kết thúc với mã thoát 0
stdout: Tiến trình con 1 đã được thực thi.
Lỗi:
Tiến trình con đã kết thúc với mã thoát 0
stdout: Tiến trình con 0 đã được thực thi.
Lỗi:
Tiến trình con đã thoát với mã thoát 0
stdout: Tiến trình con 2 đã được thực thi.
3. Sử dụng phương thức spawn() trong Node.js
Phương thức child_process.spawn khởi chạy một tiến trình mới với lệnh được chỉ định, và nó sử dụng chữ ký sau:
child_process.spawn(command[, args][, options])
Dưới đây là các tham số cần lưu ý:
- Command (chuỗi): Là lệnh cần thực thi.
- args (mảng): Danh sách các chuỗi đối số.
- options (tham số) có thể chứa một hoặc nhiều tùy chọn sau:
+ cwd (chuỗi): đường dẫn thư mục làm việc của quy trình con.
+ env (đối tượng): cặp key - value của môi trường.
+ stdio (mảng): cấu hình đầu vào/ra chuẩn của quy trình con.
+ customFds (mảng): các tệp không được chấp nhận để quy trình con sử dụng cho đầu vào/ra chuẩn.
+ detached (Boolean): quy trình con sẽ chạy độc lập với quy trình cha.
+ uid (số): thiết lập nhận dạng người dùng của quy trình.
+ gid (số): thiết lập nhận dạng nhóm của quy trình.
Phương thức spawn() trả về các luồng (stdout & stderr) và được sử dụng khi quy trình trả về dữ liệu theo khối. spawn() bắt đầu nhận phản hồi ngay sau khi quy trình bắt đầu thực thi.
Ví dụ
Tạo 2 tệp js với tên lần lượt là support.js và master.js:
Tệp: support.js:
console.log('Quá trình con ' + process.argv[2] + ' được thực thi.' );
Tệp: master.js:
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('tiến trình con đã thoát với mã ' + code);
});
}
Sau đó chạy master.js để xem kết quả:
node master.js
Xác nhận đầu ra và máy chủ đã khởi động:
stdout: Tiến trình con 0 đã được thực thi.
tiến trình con đã thoát với mã 0
stdout: Tiến trình con 1 đã được thực thi.
stdout: Tiến trình con 2 đã được thực thi.
tiến trình con đã thoát với mã 0
tiến trình con đã thoát với mã 0
4. Sử dụng phương thức fork() trong Node.js
Phương thức child_process.fork là một lựa chọn đặc biệt của spawn() để tạo các tiến trình Node mới, nó có chữ ký như sau:
child_process.fork(modulePath[, args][, options])
Trong đó:
- modulePath (chuỗi): Đường dẫn của module để chạy trong tiến trình con.
- args (mảng): Danh sách các chuỗi đối số.
- options (đối tượng) có thể chứa một hoặc nhiều tùy chọn sau đây:
+ cwd (chuỗi): Thư mục làm việc hiện tại của tiến trình con.
+ env (đối tượng): Bộ key - value của môi trường.
+ execPath (chuỗi): Đường dẫn được sử dụng để tạo child process.
+ execArgv (mảng): Danh sách các chuỗi đối số được gán cho file thực thi (mặc định: process.execArgv).
+ silent (Boolean): Nếu giá trị là true, stdin, stdout và stderr của child sẽ được gửi đến process cha, nếu không nó sẽ được thừa kế từ process cha.
+ uid (số): Xác định quyền nhận dạng của người dùng cho quy trình.
+ gid (số): Xác định nhóm nhận dạng của quy trình.
Phương thức fork trả về một đối tượng với kênh giao tiếp tích hợp trong tất cả các phương thức của biến thể ChildProcess chuẩn.
Ví dụ
Tạo 2 tập tin js và đặt tên chúng là support.js và master.js:
Tập tin: support.js:
console.log('Quá trình con ' + process.argv[2] + ' đã được thực thi.' );
Tập tin: 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('quá trình con đã thoát với mã ' + code);
});
}
Sau đó, thực hiện lệnh master.js để kiểm tra kết quả:
node master.js
Xác nhận kết quả và khởi động máy chủ:
Child Process 0 được thực thi.
Child Process 1 đã thực thi.
Child Process 2 đã thực thi.
child process đã thoát với mã 0
child process đã thoát với mã 0
child process đã thoát với mã 0
Trong bài viết này, chúng tôi đã giới thiệu về Node.js - một nền tảng ứng dụng mở rộng. Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào, hãy để lại ý kiến của bạn trong phần bình luận dưới đây. Hãy tham khảo thêm các bài viết khác trên Mytour để hiểu rõ hơn về Framework Express trong Node.js.
