Node.js - Ứng dụng mở rộng quy mô

Node.js chạy ở chế độ đơn luồng, nhưng nó sử dụng mô hình hướng sự kiện để xử lý đồng thời. Nó cũng tạo điều kiện thuận lợi cho việc tạo ra các quy trình con để tận dụng xử lý song song trên các hệ thống dựa trên CPU đa lõi.

Các quy trình con luôn có ba luồng child.stdin, child.stdoutchild.stderr có thể được chia sẻ với các luồng stdio của quy trình mẹ.

Node cung cấp child_process mô-đun có ba cách chính sau đây để tạo quy trình con.

  • exec - Phương thức child_process.exec chạy một lệnh trong shell / console và đệm đầu ra.

  • spawn - child_process.spawn khởi chạy một quy trình mới bằng một lệnh đã cho.

  • fork - Phương thức child_process.fork là một trường hợp đặc biệt của spawn () để tạo các tiến trình con.

Phương thức thực thi ()

Phương thức child_process.exec chạy một lệnh trong trình bao và đệm đầu ra. Nó có chữ ký sau:

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

Thông số

Đây là mô tả của các tham số được sử dụng -

  • command (Chuỗi) Lệnh chạy, với các đối số được phân tách bằng dấu cách

  • options (Đối tượng) có thể bao gồm một hoặc nhiều tùy chọn sau:

    • 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) Các cặp khóa-giá trị môi trường

    • encoding (Chuỗi) (Mặc định: 'utf8')

    • shell (Chuỗi) Shell để thực thi lệnh với (Mặc định: '/ bin / sh' trên UNIX, 'cmd.exe' trên Windows, Shell phải hiểu công tắc -c trên UNIX hoặc / s / c trên Windows. Trên Windows, phân tích 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 danh tính người dùng của quy trình.

    • gid (Số) Đặt danh tính nhóm của quy trình.

  • callback Hàm nhận ba đối số error, stdout,stderr được gọi với đầu ra khi quá trình kết thúc.

Phương thức execute () trả về một bộ đệm có kích thước tối đa và đợi quá trình kết thúc và cố gắng trả lại tất cả dữ liệu được đệm cùng một lúc.

Thí dụ

Hãy để chúng tôi tạo hai tệp js có tên support.js và 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);
   });
}

Bây giờ chạy master.js để xem kết quả -

$ node master.js

Xác minh đầu ra. Máy chủ đã khởi động.

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.

Phương thức spawn ()

Phương thức child_process.spawn khởi chạy một tiến trình mới bằng một lệnh đã cho. Nó có chữ ký sau:

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

Thông số

Đây là mô tả của các tham số được sử dụng -

  • command (Chuỗi) Lệnh chạy

  • args (Mảng) Danh sách các đối số chuỗi

  • options (Đối tượng) có thể bao gồm một hoặc nhiều tùy chọn sau:

    • 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) Các cặp khóa-giá trị của môi trường.

    • stdio (Mảng) Cấu hình stdio của String Child.

    • customFds (Mảng) Bộ mô tả tệp không được chấp nhận để con sử dụng cho stdio.

    • detached (Boolean) Đứa trẻ sẽ là trưởng nhóm quy trình.

    • uid (Số) Đặt danh tính người dùng của quy trình.

    • gid (Số) Đặt danh tính nhóm của quy trình.

Phương thức spawn () trả về các luồng (stdout & stderr) và nó sẽ được sử dụng khi quá trình trả về một lượng lớn dữ liệu. spawn () bắt đầu nhận phản hồi ngay khi tiến trình bắt đầu thực thi.

Thí dụ

Tạo hai tệp js có tên support.js và 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);
   });
}

Bây giờ chạy master.js để xem kết quả -

$ node master.js

Xác minh đầu ra. Máy chủ đã khởi động

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

Phương thức fork ()

Phương thức child_process.fork là một trường hợp đặc biệt của spawn () để tạo các tiến trình Node. Nó có chữ ký sau:

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

Thông số

Đây là mô tả của các tham số được sử dụng -

  • modulePath (Chuỗi) Mô-đun chạy trong con.

  • args (Mảng) Danh sách các đối số chuỗi

  • options (Đối tượng) có thể bao gồm một hoặc nhiều tùy chọn sau:

    • 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) Các cặp khóa-giá trị của môi trường.

    • execPath (Chuỗi) Thực thi được sử dụng để tạo tiến trình con.

    • execArgv (Mảng) Danh sách các đối số chuỗi được truyền cho tệp thực thi (Mặc định: process.execArgv).

    • silent (Boolean) Nếu true, stdin, stdout và stderr của con sẽ được chuyển đến cha mẹ, nếu không chúng sẽ được thừa kế từ cha mẹ, hãy xem các 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 (Số) Đặt danh tính người dùng của quy trình.

    • gid (Số) Đặt danh tính nhóm của quy trình.

Phương thức fork trả về một đối tượng có kênh giao tiếp tích hợp ngoài việc có tất cả các phương thức trong một phiên bản ChildProcess bình thường.

Thí dụ

Tạo hai tệp js có tên support.js và 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);
   });
}

Bây giờ chạy master.js để xem kết quả -

$ node master.js

Xác minh đầu ra. Máy chủ đã khởi động.

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