Nodejs tạo chủ đề

trong nút. js, worker thread trở nên hữu ích khi thực hiện các tác vụ JavaScript lớn. Worker đơn giản hóa việc chạy mã Javascript song song bằng cách sử dụng các luồng, làm cho nó nhanh hơn và hiệu quả hơn đáng kể. Chúng tôi có thể hoàn thành các công việc khó khăn mà không làm gián đoạn luồng chính. Chuỗi công nhân không có sẵn trong các phiên bản Node trước đó.  

Nó cũng chịu trách nhiệm chuyển các phiên bản ArrayBuffer để xử lý các hoạt động sử dụng nhiều CPU

Nút. js worker thread đã được chứng minh là giải pháp tốt nhất cho hiệu năng của CPU nhờ các tính năng sau

  • Nó chạy một quy trình duy nhất với nhiều luồng
  • Chạy một phiên bản JS Engine trên mỗi luồng
  • Thực hiện một vòng lặp sự kiện trên mỗi luồng
  • Thực thi nút đơn. js trên mỗi luồng

Để bắt đầu, chúng ta phải cập nhật Nút của mình. js lên phiên bản mới hơn.  

Chương trình sau đại học. Phát triển web đầy đủ ngăn xếp

hợp tác với Caltech CTME Đăng ký ngay

Nodejs tạo chủ đề

Lịch sử các ứng dụng sử dụng nhiều CPU trong nút. js

Có một số cách để chạy các ứng dụng sử dụng nhiều CPU trong Node. js trước chủ đề công nhân. Một số trong số họ được đề cập ở đây

  • Chạy các chương trình sử dụng nhiều CPU trong quy trình con với mô-đun quy trình con
  • Để thực hiện nhiều tác vụ sử dụng nhiều CPU trong nhiều quy trình, hãy sử dụng mô-đun cụm
  • Sử dụng mô-đun của bên thứ ba như Napa. js từ Microsoft

Tuy nhiên, không có giải pháp thay thế nào trong số này được triển khai rộng rãi do hạn chế về hiệu suất, độ phức tạp gia tăng, thiếu sự chấp nhận, tính không ổn định và tài liệu

Sử dụng Worker Threads cho các hoạt động chuyên sâu của CPU

Worker thread là một giải pháp tuyệt vời cho vấn đề tương tranh của JavaScript; . Thay vào đó, cách tiếp cận chuỗi công nhân cho phép các ứng dụng sử dụng một số công nhân JavaScript bị cô lập, với Nút cung cấp giao tiếp giữa công nhân và công nhân mẹ. Mỗi worker trong Node. js có phiên bản Vòng lặp sự kiện và V8 của riêng mình. Công nhân, không giống như tiến trình con, có thể trao đổi bộ nhớ

Ví dụ

const {Công nhân} = yêu cầu ('worker_threads')

const runService = (WorkerData) => {

trả lại Lời hứa mới ((giải quyết, từ chối) => {

const worker = new Worker('. /workerVí dụ. js', { WorkerData });

người làm việc. on('tin nhắn', giải quyết);

người làm việc. on('lỗi', từ chối);

người làm việc. on('thoát', (mã) => {

nếu (mã. == 0)

reject(new Error(`stopped with ${code} exit code`));

})

})

}

const run = async() => {

kết quả const = đang chờ runService ('nút xin chào. js')

bảng điều khiển. nhật ký (kết quả);

}

chạy(). bắt (err => bàn điều khiển. lỗi (err))

Thêm cái này vào workerExample. tập tin js

const { WorkerData, parentPort } = yêu cầu('worker_threads')

cha mẹ. postMessage({ hoan nghênh. WorkerData })

đầu ra

{ hoan nghênh. 'xin chào nút. js' }

Chúng tôi đã nhập Công nhân từ chuỗi công nhân trong chính của chúng tôi. js, sau đó chuyển dữ liệu (tên tệp) để nhân viên xử lý. Như đã thấy trong workerExample. js, bước tiếp theo là lắng nghe các sự kiện tin nhắn từ worker thread. Ứng dụng chính của chúng tôi gửi WorkerData đến dịch vụ worker này, bao gồm một phương tiện để truyền lại dữ liệu đã xử lý qua parentPort. Chúng tôi sử dụng postMessage() trên đối tượng này (parentPort) để cung cấp dữ liệu đã xử lý

Worker thread cũng cho phép chúng ta chia sẻ bộ nhớ bằng cách sử dụng các đối tượng SharedArrayBuffer. Chuyển các đối tượng ArrayBuffer cũng có thể được sử dụng để chia sẻ bộ nhớ

khóa học miễn phí. Bắt đầu với NodeJS

Nắm vững kiến ​​thức cơ bản về NodeJS Đăng ký ngay

Nodejs tạo chủ đề

Worker Thread hoạt động như thế nào?

Nodejs tạo chủ đề

Worker thread đã được giới thiệu như một tính năng thử nghiệm trong Node V10. Trong phiên bản 12, nó đã trở nên ổn định. Bởi vì worker thread không phải là thành phần tích hợp sẵn của Javascript, nên chúng không hoạt động chính xác như một hệ thống đa luồng tiêu chuẩn. Nó cho phép các tác vụ đắt tiền được ủy quyền cho các luồng khác nhau thay vì dừng vòng lặp sự kiện của ứng dụng

Công việc của chuỗi công nhân là thực thi mã đã được chỉ định bởi chuỗi gốc hoặc chuỗi chính. Mỗi công nhân hoạt động độc lập. Mặt khác, một công nhân và cha mẹ của nó có thể giao tiếp qua kênh tin nhắn. Khi Javascript không kích hoạt đa luồng, các luồng công nhân sẽ sử dụng một phương pháp cụ thể để giữ cho các công nhân tách biệt với nhau. Công cụ V8 của Chrome được sử dụng để thực thi Node. V8 cho phép chúng tôi tạo thời gian chạy V8 bị cô lập. V8 Isolate là các phiên bản biệt lập với đống Javascript và hàng đợi tác vụ vi mô của riêng chúng. Ứng dụng Node có nhiều phiên bản Node chạy trong cùng một quy trình khi worker đang hoạt động. Mặc dù Javascript không hỗ trợ đồng thời theo mặc định, các luồng công nhân cung cấp một giải pháp thay thế để chạy một số luồng trong cùng một quy trình

Điều gì phân biệt chủ đề công nhân

  • Để truyền dữ liệu bắt đầu, WorkerData được sử dụng. Một giá trị JavaScript tùy ý chứa một bản sao của dữ liệu được cung cấp cho Worker function Object() { [native code] } của chủ đề này. Như dùng postMessage thì dữ liệu bị clone()
  • MessagePort là cổng giao tiếp cho phép nhiều luồng giao tiếp với nhau. Nó có thể được sử dụng để gửi dữ liệu có cấu trúc, vùng bộ nhớ và các MessagePort khác từ nhân viên này sang nhân viên khác
  • Atomics là một công cụ cho phép bạn chạy nhiều quy trình cùng lúc, giúp tiết kiệm thời gian và cho phép bạn sử dụng JavaScript để thêm các biến có điều kiện
  • MessageChannel là kênh giao tiếp hai chiều không đồng bộ có thể được sử dụng để giao tiếp giữa các luồng

Làm thế nào để nút. js chạy song song?

V8 isolate là phiên bản thời gian chạy Chrome V8 độc lập với bộ nhớ JS riêng và hàng đợi vi tác vụ. Điều này cho phép mỗi nút. js worker để chạy mã JavaScript của nó hoàn toàn độc lập với các worker khác. Nhược điểm là các công nhân không thể truy cập ngay vào các đống của nhau

Khóa học Full Stack Web Developer

Để trở thành chuyên gia về MEAN Stack Xem khóa học

Nodejs tạo chủ đề

Vượt qua ranh giới JS/C++

Sử dụng nút. js', tập lệnh được chuyển đến V8. Mã JS trong tập lệnh đã chỉ định được V8 biên dịch và giá trị tương đương của hợp ngữ được trả về. Mã lắp ráp được tạo ra sau đó được chạy bởi Node. js bằng API V8 khác. Mã được biên dịch thành hợp ngữ và được trình biên dịch sao chép vào bộ nhớ

Để chạy mã đã biên dịch, nó phân bổ một không gian trên bộ nhớ, di chuyển mã đến không gian được phân bổ và nhảy vào không gian bộ nhớ. Thực thi bây giờ bắt đầu từ mã được biên dịch ở bước nhảy. Kết quả là, nó đã vượt qua một dòng. Mã hiện đang được chạy là mã JS chứ không phải mã C++. Tất cả các mảnh hiện đang ở vị trí để lắp ráp. Khi mã JS được biên dịch xong, nó sẽ trở về mã C++.   

Các thuật ngữ "mã C++" và "mã JS" không đề cập đến mã nguồn C++ hoặc JS. Đó là mã hợp ngữ do trình biên dịch tạo ra từ mã nguồn của chúng đang được thực thi để phân biệt mã hợp ngữ nào đang được thực thi

Dựa trên những điều trên, chúng ta có thể chia quá trình thiết lập worker thành hai giai đoạn.  

  1. Khởi tạo worker
  2. Chạy công nhân

Bước khởi tạo

  • Mô-đun luồng công nhân trong tập lệnh Userland được sử dụng để xây dựng một phiên bản công nhân
  • Tập lệnh khởi tạo cho worker cha của Node gọi C++ và tạo một thể hiện của đối tượng worker trống. Tại thời điểm này, worker được tạo chỉ là một đối tượng C++ đơn giản chưa bắt đầu
  • Khi một đối tượng công nhân C++ được tạo, nó sẽ tự gán chính nó cho một luồng và tạo ID luồng
  • Khi đối tượng worker được hình thành, worker cha sẽ tạo một kênh thông báo khởi tạo trống
  • Tập lệnh khởi tạo worker tạo kênh thông báo JS công khai. Đây là kênh tin nhắn mà userland JS sử dụng để gửi tin nhắn giữa cha mẹ và nhân viên con
  • Siêu dữ liệu khởi tạo cho tập lệnh thực thi worker được ghi vào IMC bởi tập lệnh khởi tạo worker của nút cha, tập lệnh này gọi vào C++

Bước chạy

Quá trình khởi tạo hiện đã hoàn tất. Chuỗi công nhân sau đó được bắt đầu bởi tập lệnh khởi tạo công nhân, tập lệnh này gọi vào C++

  • Công nhân được cách ly động cơ V8 mới để làm việc với. V8 isolate là phiên bản thời gian chạy V8 tự chạy. Do đó, bối cảnh thực thi của luồng công nhân được tách biệt khỏi phần còn lại của mã ứng dụng
  • libuv đã được thiết lập. Điều này cho phép luồng công nhân chạy vòng lặp sự kiện riêng của nó tách biệt với phần còn lại của chương trình
  • Tập lệnh thực thi của nhân viên được thực hiện và vòng lặp sự kiện cho nhân viên được bắt đầu
  • Thực hiện công nhân.  
  1. Tập lệnh sử dụng C++ để truy cập siêu dữ liệu khởi tạo của IMC
  2. Tập lệnh thực thi worker chạy tệp sẽ được worker sử dụng. Công nhân-đơn giản trong trường hợp của chúng tôi, là ví dụ. js

Tận dụng tốt nhất các chủ đề của nhân viên

Bây giờ chúng ta biết cách Node. js Worker Chủ đề chức năng. Hiểu cách chúng hoạt động có thể giúp chúng tôi đạt được kết quả tốt nhất từ ​​worker thread. Khi tạo các ứng dụng phức tạp hơn so với worker-simple. js, chúng ta phải ghi nhớ hai cân nhắc luồng công nhân chính sau đây

  • Mặc dù các worker thread nhẹ hơn các quy trình thực tế, nhưng các worker sinh sản đòi hỏi nỗ lực đáng kể và có thể tốn kém nếu được thực hiện thường xuyên
  • Sử dụng worker thread để song song hóa các hoạt động I/O không hiệu quả về chi phí vì sử dụng Node. js tương đối nhanh hơn so với việc thiết lập một worker thread từ đầu chỉ để làm điều đó

Khóa học mới. Phát triển Full Stack cho người mới bắt đầu

Tìm hiểu Git Command, Angular, NodeJS, Maven và hơn thế nữa Đăng ký ngay

Nodejs tạo chủ đề

Tổng hợp chủ đề công nhân

trong nút. js, nhóm luồng công nhân là một tập hợp các luồng công nhân đang hoạt động có thể được sử dụng để hoàn thành một công việc sắp tới. Khi nhận được một nhiệm vụ mới, nhiệm vụ đó có thể được giao cho một nhân viên có sẵn. Khi worker đã hoàn thành nhiệm vụ, kết quả có thể được trả về cho cha và worker lại sẵn sàng nhận nhiệm vụ mới. Tổng hợp luồng, khi được triển khai đúng cách, có thể tăng tốc độ đáng kể bằng cách giảm chi phí sinh ra luồng mới. Cũng cần lưu ý rằng việc thiết lập nhiều luồng là không hiệu quả vì số lượng luồng song song có thể chạy đúng cách luôn bị hạn chế bởi phần cứng

Nâng cao sự nghiệp của bạn với tư cách là nhà phát triển MEAN stack với Nhà phát triển Web Full Stack - Chương trình của MEAN Stack Master. đăng ký ngay bây giờ

Phần kết luận

Vào tháng 4 năm 2019, Node. js v12 đã được khởi chạy. Chủ đề công nhân, được bật theo mặc định trong phiên bản này, hiện đã được hỗ trợ (thay vì cần cờ thời gian chạy tùy chọn). Việc sử dụng nhiều lõi CPU trong Node chưa bao giờ dễ dàng hơn thế. ứng dụng js

Khả năng này có thể được sử dụng bởi Node. js với khối lượng công việc sử dụng nhiều CPU để giảm thời gian thực thi. Điều này đặc biệt quan trọng đối với Node. js chức năng không có máy chủ vì nền tảng không có máy chủ tính phí dựa trên thời gian thực thi. Sử dụng một số lõi CPU dẫn đến hiệu suất nâng cao cũng như giảm chi phí

Công nhân (luồng) rất hữu ích để thực hiện các tác vụ JavaScript cần nhiều năng lượng CPU. Chúng không hữu ích cho các tác vụ yêu cầu nhiều I/O. Các hoạt động I/O không đồng bộ được tích hợp trong Node. js hiệu quả hơn Công nhân. Các luồng công nhân, không giống như tiến trình con hoặc cụm, có thể chia sẻ bộ nhớ. Họ đạt được điều này thông qua việc chia sẻ các phiên bản SharedArrayBuffer hoặc chuyển các đối tượng ArrayBuffer. Chúng tôi hy vọng rằng bài viết này có thể cung cấp cho bạn kiến ​​thức toàn diện về các tính năng của Node Js worker và cách chúng tôi có thể sử dụng nó trong các dự án phát triển phần mềm của mình

Nếu bạn muốn tìm hiểu thêm về NodeJS và các khái niệm liên quan khác, bạn có thể đăng ký Khóa học Chứng chỉ Phát triển Web Full Stack độc quyền của Simplilearn và đẩy nhanh sự nghiệp của bạn với tư cách là nhà phát triển phần mềm. Chương trình bao gồm nhiều khóa học phát triển phần mềm khác nhau, từ các nguyên tắc cơ bản đến các chủ đề nâng cao.  

Simplilearn cũng cung cấp các khóa học nâng cao kỹ năng trực tuyến miễn phí trong một số lĩnh vực, từ khoa học dữ liệu và phân tích kinh doanh đến phát triển phần mềm, trí tuệ nhân tạo và máy học. Bạn có thể tham gia bất kỳ khóa học nào trong số này để nâng cao kỹ năng và thăng tiến trong sự nghiệp của mình

Tìm Chương trình sau đại học của chúng tôi trong Chương trình đào tạo trực tuyến về phát triển web Full Stack tại các thành phố hàng đầu

NameDatePlacePost Chương trình sau đại học về Phát triển Web Full Stack Nhóm bắt đầu vào ngày 11 tháng 1 năm 2023,
Đợt cuối tuầnChi tiết CityView của bạnChương trình sau đại học về Phát triển Web Full Stack, SydneyCohort bắt đầu vào ngày 26 tháng 1 năm 2023,
Weekend batchSydneyView DetailsPost Graduate Program in Full Stack Web Development, MelbourneCohort starts on 15th Feb 2023,
Weekend batchMelbourneView Details

Giới thiệu về tác giả

Nodejs tạo chủ đề
Ravikiran AS

Ravikiran A S làm việc với Simplilearn với tư cách là Nhà phân tích nghiên cứu. Anh ấy là một người đam mê nhiệt tình, luôn săn lùng những công nghệ mới nhất. Anh ấy thành thạo Ngôn ngữ lập trình Java, Dữ liệu lớn và các Khung dữ liệu lớn mạnh mẽ như Apache Hadoop và Apache Spark

Làm cách nào để tạo chủ đề trong NodeJs?

Trong chỉ mục. js, bạn sẽ sử dụng mô-đun worker-threads để khởi tạo luồng và bắt đầu tác vụ trong worker. tệp js chạy song song với luồng chính . Khi tác vụ hoàn thành, worker thread sẽ gửi một thông báo chứa kết quả trở lại main thread.

Chúng ta có thể tạo nút JS đa luồng không?

js bản thân nó là một ứng dụng đa luồng. Điều này hiển nhiên khi bạn sử dụng một trong các phương pháp không đồng bộ của thư viện chuẩn để thực hiện các thao tác I/O, chẳng hạn như đọc tệp hoặc thực hiện yêu cầu mạng. Các tác vụ này được ủy quyền cho một nhóm luồng riêng biệt mà Node tạo và duy trì bằng thư viện libuv C

Là nút vẫn còn đơn luồng?

Nền tảng Node JS sử dụng kiến ​​trúc “Vòng lặp sự kiện theo luồng đơn” để xử lý nhiều máy khách đồng thời . Sau đó, cách nó thực sự xử lý các yêu cầu máy khách đồng thời mà không cần sử dụng nhiều luồng.

Làm cách nào để sử dụng chuỗi công nhân trong NodeJs?

Luồng công nhân sau đó được bắt đầu bởi tập lệnh khởi tạo công nhân, gọi vào C++. .
Công nhân được cách ly động cơ V8 mới để làm việc với. V8 isolate là phiên bản thời gian chạy V8 tự chạy. .
libuv đã được thiết lập. .
Tập lệnh thực thi của nhân viên được thực hiện và vòng lặp sự kiện cho nhân viên được bắt đầu