Đa luồng NodeJS
Công nhân (luồng) rất hữu ích để thực hiện các hoạt động JavaScript sử dụng nhiều CPU. Chúng không giúp ích nhiều cho công việc chuyên sâu về I/O. nút. js hoạt động I/O không đồng bộ tích hợp hiệu quả hơn Công nhân có thể Show
Không giống như 93 hoặc 94, 95 có thể chia sẻ bộ nhớ. Họ làm như vậy bằng cách chuyển 96 phiên bản hoặc chia sẻ 0 phiên bản
Ví dụ trên sinh ra một Worker thread cho mỗi cuộc gọi 1. Trong thực tế, hãy sử dụng một nhóm Công nhân cho các loại nhiệm vụ này. Nếu không, chi phí tạo Công nhân có thể sẽ vượt quá lợi ích của họKhi triển khai nhóm công nhân, hãy sử dụng API 2 để thông báo cho các công cụ chẩn đoán (e. g. để cung cấp dấu vết ngăn xếp không đồng bộ) về mối tương quan giữa các tác vụ và kết quả của chúng. Xem "Sử dụng 2 cho nhóm luồng 4" trong tài liệu 5 để biết cách triển khai ví dụChuỗi công nhân kế thừa các tùy chọn không dành riêng cho quy trình theo mặc định. Tham khảo 6 để biết cách tùy chỉnh các tùy chọn luồng công nhân, cụ thể là tùy chọn 7 và 8const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }9#Lịch sửPhiên bảnThay đổiv17. 5. 0, v16. 15. 0 Không còn thử nghiệm v15. 12. 0, v14. 18. 0Đã thêm vào. v15. 12. 0, v14. 18. 0
Trong chuỗi công nhân, 11 trả về một bản sao dữ liệu được truyền cho chuỗi sinh sản của chuỗi 12. Mỗi 4 mới sẽ tự động nhận được bản sao dữ liệu môi trường của chính nóconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }14#Là 15 nếu mã này không chạy bên trong luồng 4const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }17#Đã thêm vào. v14. 5. 0, v12. 19. 0 Đánh dấu một đối tượng là không thể chuyển nhượng. Nếu 18 xuất hiện trong danh sách chuyển giao của cuộc gọi 19, nó sẽ bị bỏ quaĐặc biệt, điều này có ý nghĩa đối với các đối tượng có thể được nhân bản, thay vì chuyển giao và được sử dụng bởi các đối tượng khác ở phía gửi. Ví dụ, nút. js đánh dấu các 96 mà nó sử dụng cho nhóm 11 của mình với cái nàyKhông thể hoàn tác thao tác này Không có tương đương với API này trong trình duyệt const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }12#Chuyển một 13 sang một bối cảnh 14 khác. Đối tượng 15 ban đầu được hiển thị không sử dụng được và phiên bản 13 được trả về sẽ thay thế 13 được trả về là một đối tượng trong ngữ cảnh đích và kế thừa từ lớp 18 toàn cầu của nó. Các đối tượng được chuyển đến trình nghe 19 cũng được tạo trong ngữ cảnh đích và kế thừa từ lớp 18 toàn cầu của nóTuy nhiên, 13 đã tạo không còn kế thừa từ 22 nữa và chỉ có thể sử dụng 19 để nhận các sự kiện sử dụng nóconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }24#Nếu chủ đề này là một 4, thì đây là một 13 cho phép giao tiếp với chủ đề mẹ. Tin nhắn được gửi bằng 27 có sẵn trong chuỗi gốc bằng cách sử dụng 28 và tin nhắn được gửi từ chuỗi gốc bằng cách sử dụng 29 có sẵn trong chuỗi này bằng cách sử dụng 980const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }981#Lịch sửPhiên bảnThay đổiv15. 12. 0 Đối số cổng cũng có thể tham chiếu đến một 982 ngay bây giờv12. 3. 0Đã thêm vào. v12. 3. 0 Nhận một tin nhắn từ một 13 nhất định. Nếu không có tin nhắn nào, 984 được trả về, nếu không, một đối tượng có một thuộc tính 985 duy nhất chứa tải trọng tin nhắn, tương ứng với tin nhắn cũ nhất trong hàng đợi của 13Khi chức năng này được sử dụng, không có sự kiện 987 nào được phát ra và trình nghe 988 không được gọiconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }989#Đã thêm vào. v13. 2. 0, v12. 16. 0 Cung cấp tập hợp các ràng buộc tài nguyên công cụ JS bên trong Worker thread này. Nếu tùy chọn 930 được truyền cho hàm tạo 4, thì tùy chọn này khớp với các giá trị của nóNếu điều này được sử dụng trong luồng chính, giá trị của nó là một đối tượng trống const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }932Một giá trị đặc biệt có thể được truyền dưới dạng tùy chọn 933 của hàm tạo 4, để chỉ ra rằng luồng hiện tại và luồng Công nhân sẽ chia sẻ quyền truy cập đọc và ghi vào cùng một nhóm biến môi trườngconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }935#Lịch sửPhiên bảnThay đổiv17. 5. 0, v16. 15. 0 Không còn thử nghiệm v15. 12. 0, v14. 18. 0Đã thêm vào. v15. 12. 0, v14. 18. 0
API 12 đặt nội dung của 11 trong luồng hiện tại và tất cả các phiên bản 4 mới được sinh ra từ ngữ cảnh hiện tạiconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }945#Mã định danh số nguyên cho luồng hiện tại. Trên đối tượng worker tương ứng (nếu có), nó có sẵn là 945. Giá trị này là duy nhất cho mỗi phiên bản 4 bên trong một quy trìnhconst { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }948#Một giá trị JavaScript tùy ý chứa một bản sao của dữ liệu được truyền tới hàm tạo 4 của luồng nàyDữ liệu được sao chép như thể sử dụng 950, theo thuật toán sao chép có cấu trúc HTMLLớp. const { Worker, isMainThread, parentPort, workerData, } = require('node:worker_threads'); if (isMainThread) { module.exports = function parseJSAsync(script) { return new Promise((resolve, reject) => { const worker = new Worker(__filename, { workerData: script, }); worker.on('message', resolve); worker.on('error', reject); worker.on('exit', (code) => { if (code !== 0) reject(new Error(`Worker stopped with exit code ${code}`)); }); }); }; } else { const { parse } = require('some-js-parsing-library'); const script = workerData; parentPort.postMessage(parse(script)); }951#Lịch sửPhiên bảnThay đổiv18. 0. 0 Không còn thử nghiệm v15. 4. 0Đã thêm vào. v15. 4. 0 Các phiên bản của 982 cho phép giao tiếp một-nhiều không đồng bộ với tất cả các phiên bản 982 khác được liên kết với cùng một tên kênh 1
const {
Worker, isMainThread, parentPort, workerData,
} = require('node:worker_threads');
if (isMainThread) {
module.exports = function parseJSAsync(script) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, {
workerData: script,
});
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0)
reject(new Error(`Worker stopped with exit code ${code}`));
});
});
};
} else {
const { parse } = require('some-js-parsing-library');
const script = workerData;
parentPort.postMessage(parse(script));
} |