CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN này hướng dẫn giới thiệu tối giản Nodejs (3): Quá trình được tác giả sưu tầm và sắp xếp. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Mặc dù bản thân Node có nhiều luồng nhưng JavaScript chạy trên v8 là luồng đơn. Mô-đun child_process của Node được sử dụng để tạo các tiến trình con và chúng ta có thể tận dụng tối đa CPU thông qua các tiến trình con. ví dụ:
。
Sao chép mã Mã này như sau:
var fork = require('child_process').fork;
// Lấy số lượng CPU của máy hiện tại
var cpus = yêu cầu ('hệ điều hành').cpus();
đối với (var i = 0; i < cpus.length; i++) {
// Tạo tiến trình mới
ngã ba('./worker.js');
}
。
Dưới đây là một số phương pháp tạo quy trình bao gồm fork:
1.spawn(lệnh, [args], [options]), bắt đầu một tiến trình mới để thực thi lệnh lệnh, args là tham số dòng lệnh 2.exec(lệnh, [options], callback), bắt đầu một tiến trình mới để thực thi lệnh lệnh, lệnh gọi lại được sử dụng để lấy thông tin đầu vào, đầu ra tiêu chuẩn và lỗi khi quá trình kết thúc 3.execFile(file, [args], [options], [gọi lại]), bắt đầu một quy trình mới để thực thi tệp tệp thực thi, lệnh gọi lại được sử dụng để lấy thông tin đầu vào, đầu ra tiêu chuẩn và lỗi khi quá trình kết thúc 4. fork (modulePath, [args], [options]) , bắt đầu một quy trình mới được sử dụng để thực thi mô-đun tệp JavaScript. Tại thời điểm này, một quy trình con Node được tạo.
Giao tiếp giữa các quá trình của nút.
tiến trình cha mẹ.
。
Sao chép mã Mã này như sau:
// cha mẹ.js
var fork = require('child_process').fork;
// fork trả về đối tượng tiến trình con n
var n = fork('./child.js');
// Xử lý thông báo sự kiện
n.on('tin nhắn', hàm(m) {
//Nhận tin nhắn được gửi bởi tiến trình con
console.log('nhận được tin nhắn: ' + m);
});
//Gửi thông điệp tới tiến trình con
n.send({xin chào: 'thế giới'});
。
quá trình con.
。
Sao chép mã Mã này như sau:
// con.js
// Xử lý thông báo sự kiện
process.on('tin nhắn', hàm(m) {
console.log('nhận được tin nhắn: ' + m);
});
// Có một phương thức gửi trong tiến trình, được sử dụng để gửi tin nhắn đến tiến trình cha
tiến trình.gửi({foo: 'bar'});
。
Cần lưu ý rằng phương thức gửi ở đây là đồng bộ, do đó không nên gửi lượng lớn dữ liệu (thay vào đó bạn có thể sử dụng pipe, để biết chi tiết, hãy xem: http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_options ). Trong trường hợp đặc biệt, nếu giá trị thuộc tính cmd trong tin nhắn chứa tiền tố NODE_ (ví dụ: tin nhắn {cmd: 'NODE_foo'}), thì tin nhắn này sẽ không được gửi đến sự kiện tin nhắn (nhưng sự kiện InternalMessage), đó là được sử dụng nội bộ bởi Node.
Nguyên mẫu của phương thức gửi là:
。
Sao chép mã Mã này như sau:
gửi(tin nhắn, [gửiXử lý])
。
Ở đây, sendHandle(handle) có thể được sử dụng để gửi:
1.net.Native, ổ cắm C++ TCP gốc hoặc ống 2.net.Server, máy chủ TCP 3.net.Socket, ổ cắm TCP 4.dgram.Native, ổ cắm UDP C++ gốc 5.dgram.Socket, ổ cắm UDP.
Khi gửi gửi sendHandle, nó thực sự không (và không thể) gửi trực tiếp các đối tượng JavaScript mà gửi một bộ mô tả tệp (cuối cùng được gửi dưới dạng chuỗi JSON).
Bây giờ hãy xem một ví dụ:
tiến trình cha mẹ.
。
Sao chép mã Mã này như sau:
// cha mẹ.js
var fork = require('child_process').fork;
var n = fork('./child.js');
var server = require('net').createServer();
máy chủ.listen(7000, hàm() {
//Gửi máy chủ TCP tới tiến trình con
n.send('máy chủ', máy chủ);
}).on('kết nối', hàm() {
console.log('kết nối - cha mẹ');
});
。
quá trình con.
。
Sao chép mã Mã này như sau:
process.on('tin nhắn', hàm(m, h) {
nếu (m === 'máy chủ') {
h.on('kết nối', hàm() {
console.log('kết nối - con');
});
}
});
。
Truy cập chương trình này qua cổng 7000 và đầu ra có thể là kết nối – cha hoặc kết nối – con. Ở đây, tiến trình con và tiến trình cha đang lắng nghe trên cổng 7000 cùng một lúc. Nói chung, nhiều quy trình nghe cùng một cổng sẽ gây ra ngoại lệ EADDRINUSE. Trong trường hợp này, hai quy trình khác nhau sử dụng cùng một bộ mô tả tệp và lớp Nút dưới cùng đặt tùy chọn SO_REUSEADDR trên ổ cắm khi nghe trên cổng. cho phép ổ cắm này được tái sử dụng giữa các quy trình khác nhau. Khi nhiều quy trình nghe cùng một cổng, bộ mô tả tệp chỉ có thể được sử dụng bởi một quy trình cùng lúc và việc sử dụng ổ cắm của các quy trình này là quyền ưu tiên.
mô-đun cụm.
Mô-đun cụm đã được thêm vào phiên bản 0.8 của Node. Thông qua mô-đun cụm, bạn có thể dễ dàng xây dựng một nhóm quy trình nghe trên cùng một cổng trên máy vật lý. ví dụ:
Sao chép mã Mã này như sau:
var cluster = yêu cầu('cluster');
var http = yêu cầu('http');
var numCPUs = yêu cầu ('hệ điều hành').cpus().length;
// Kiểm tra xem tiến trình có phải là tiến trình chính không
nếu (cluster.isMaster) {
đối với (var i = 0; i < numCPUs; ++i)
// Tạo một quy trình công nhân mới (chỉ có thể gọi quy trình chính)
cluster. fork();
cluster.on('exit', hàm(người làm việc, mã, tín hiệu) {
console.log('worker ' + worker.process.pid + ' đã chết');
});
} khác {
http.createServer(hàm(yêu cầu, res) {
res. writeHead(200);
res.end('xin chào thế giới\n');
}).lắng nghe(8000);
}
。
Chúng tôi gọi phương thức nghe trong quy trình công nhân và yêu cầu nghe sẽ được chuyển đến quy trình chính. Nếu đã có một máy chủ lắng nghe trong quy trình chính đáp ứng các yêu cầu của quy trình Worker thì phần xử lý của máy chủ này sẽ được chuyển cho Worker. Nếu nó không tồn tại, quy trình chính sẽ tạo một quy trình đó và sau đó chuyển phần xử lý đó. đến quá trình làm việc của người lao động.
Tài liệu chi tiết hơn về cụm: http://www.nodejs.org/api/cluster.html.
Cuối cùng, bài viết này về Hướng dẫn giới thiệu tối giản Nodejs (3): Quá trình kết thúc tại đây. Nếu bạn muốn biết thêm về Hướng dẫn giới thiệu tối giản Nodejs (3): Quy trình, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!