/ / Tính song song trong JavaScript là gì?

Tính song song trong JavaScript là gì?

JavaScript có thể gặp khó khăn với các tác vụ cần nhiều hiệu năng vì đây là ngôn ngữ đơn luồng. Sử dụng song song, bạn có thể thực thi đa luồng trong JavaScript và cải thiện hiệu suất cũng như khả năng đáp ứng của các ứng dụng web hiện đại của mình.


Tính song song trong lập trình JavaScript

Song song là rất quan trọng trong điện toán hiện đại để cải thiện hiệu suất và khả năng mở rộng. Nó thực hiện điều này bằng cách sử dụng hiệu quả các nguồn lực sẵn có.

Một kỹ thuật phổ biến được sử dụng để đạt được tính song song trong lập trình là đa luồng. Tuy nhiên, luồng JavaScript là một hệ thống đơn luồng và chỉ có thể xử lý một tác vụ tại một thời điểm. Điều này có nghĩa là nó không quen với việc thực thi chương trình song song.

Giả mạo JavaScript Lập trình song song

Một quan niệm sai lầm phổ biến về song song là bạn có thể đạt được nó bằng cách sử dụng các kỹ thuật lập trình không đồng bộ như async/await, gọi lại và lời hứa:

 
async function fetchData() {
  const response = await fetch();
  const data = await response.json();
  return data;
}


function logData(data) {
  console.log(data);
}


Promise.all([
  fetchData(),
  fetchData(),
]).then((results) => {
  console.log(results);
});


fetchData().then(logData);

Những kỹ thuật này không thực sự thực thi mã song song. JavaScript sử dụng vòng lặp sự kiện để bắt chước lập trình song song trong thiết kế một luồng của nó.

Vòng lặp sự kiện là một phần cơ bản của môi trường thời gian chạy JavaScript. Nó cho phép bạn thực hiện các hoạt động không đồng bộ, chẳng hạn như yêu cầu mạng, trong nền mà không chặn luồng đơn chính.

Vòng lặp sự kiện liên tục kiểm tra các sự kiện hoặc tác vụ mới trong hàng đợi và thực hiện tuần tự từng sự kiện một. Kỹ thuật này cho phép JavaScript đạt được tính đồng thời và tính song song lý thuyết.

Đồng thời so với song song

Đồng thời và song song thường bị hiểu sai và thay thế cho nhau trong thế giới JavaScript.

Đồng thời trong JavaScript đề cập đến khả năng thực thi nhiều tác vụ bằng cách chồng chéo việc thực hiện các tác vụ. Trong đó một nhiệm vụ có thể bắt đầu trước khi một nhiệm vụ khác hoàn thành, nhưng các nhiệm vụ không thể bắt đầu hoặc kết thúc đồng thời. Điều này cho phép JavaScript xử lý hiệu quả các hoạt động, chẳng hạn như tìm nạp dữ liệu từ API REST hoặc đọc tệp mà không chặn luồng thực thi chính.

Mặt khác, tính song song đề cập đến khả năng thực thi đồng thời nhiều tác vụ trên nhiều luồng. Các luồng nền này có thể thực thi các tác vụ một cách độc lập và đồng thời. Điều này mở ra cơ hội để đạt được sự song song thực sự trong các ứng dụng JavaScript.

Các ứng dụng của JavaScript có thể đạt được tính song song thực sự thông qua việc sử dụng Web Worker.

Công nhân web giới thiệu tính song song với JavaScript

Web Worker là một tính năng của các trình duyệt web hiện đại cho phép mã JavaScript chạy trong các luồng nền, tách biệt với luồng thực thi chính. Không giống như luồng chính xử lý các tương tác của người dùng và cập nhật giao diện người dùng. Công nhân web sẽ được dành riêng để thực hiện các tác vụ tính toán chuyên sâu.

Dưới đây là sơ đồ thể hiện hoạt động của một Web Worker trong JavaScript.

Sơ đồ mũi tên của luồng Hoạt động của Web Worker

Chủ đề chính và Công nhân web có thể giao tiếp bằng cách truyền tin nhắn. Sử dụng bàitin nhắn phương thức gửi tin nhắn và tin nhắn trình xử lý sự kiện để nhận tin nhắn, bạn có thể chuyển hướng dẫn hoặc dữ liệu qua lại.

Tạo một công nhân web

Để tạo một Web Worker, bạn cần tạo một tệp JavaScript riêng.

Đây là một ví dụ:

 


const worker = new Worker('worker.js');


worker.postMessage('Hello from the main thread!');


worker.onmessage = function(event) {
  console.log('Received message from Web Worker:', event.data);
};

Ví dụ trên tạo một Web Worker mới bằng cách chuyển đường dẫn đến tập lệnh worker (worker.js) như một đối số cho Công nhân người xây dựng. Bạn có thể gửi tin nhắn đến Web Worker bằng cách sử dụng bàitin nhắn và lắng nghe tin nhắn từ Web Worker bằng cách sử dụng tin nhắn xử lý sự kiện.

Sau đó, bạn nên tạo tập lệnh worker (worker.js) tài liệu:

 


self.onmessage = function(event) {
  console.log('Received message from main thread:', event.data);

  
  self.postMessage("Hello from worker.js!");
};

Tập lệnh Web Worker lắng nghe các thông báo từ luồng chính bằng cách sử dụng tin nhắn xử lý sự kiện. Khi nhận được tin nhắn, bạn đăng xuất tin nhắn bên trong dữ liệu sự kiện và gửi một tin nhắn mới đến chủ đề chính với bàitin nhắn phương pháp.

Tận dụng tính song song với công nhân web

Trường hợp sử dụng chính cho Web Worker là thực thi song song các tác vụ JavaScript chuyên sâu về mặt tính toán. Bằng cách giảm tải các tác vụ này cho Web Worker, bạn có thể đạt được những cải tiến đáng kể về hiệu suất.

Đây là một ví dụ về việc sử dụng một nhân viên web để thực hiện một phép tính nặng:

 

const worker = new Worker('worker.js');


worker.postMessage([1, 2, 3, 4, 5]);


worker.onmessage = function(event) {
  const result = event.data;
  console.log('Calculation result:', result);
};

Công nhân.js:

 
self.onmessage = function (event) {
  const numbers = event.data;

  const result = performHeavyCalculation(numbers);

  
  self.postMessage(result);
};

function performHeavyCalculation(data) {
  
  return data
    .map((number) => Math.pow(number, 3))
    .filter((number) => number % 2 === 0)
    .reduce((sum, number) => sum + number, 0);
}

Trong ví dụ này, bạn chuyển một dãy số từ luồng chính tới Web Worker. Web Worker thực hiện tính toán bằng cách sử dụng mảng dữ liệu được cung cấp và gửi kết quả trở lại luồng chính. Các biểu diễnHeavyCalculation() hàm ánh xạ từng số vào khối lập phương của nó, lọc ra các số chẵn và cuối cùng tính tổng chúng.

Hạn chế và Cân nhắc

Mặc dù Web Worker cung cấp một cơ chế để đạt được tính song song trong JavaScript, nhưng điều quan trọng là phải xem xét một vài hạn chế và cân nhắc:

  • Không có bộ nhớ dùng chung: Web Worker hoạt động trong các luồng riêng biệt và không chia sẻ bộ nhớ với luồng chính. Vì vậy, họ không thể truy cập trực tiếp các biến hoặc đối tượng từ luồng chính mà không truyền thông báo.
  • Tuần tự hóa và giải tuần tự hóa: Khi truyền dữ liệu giữa luồng chính và Công nhân web, bạn cần tuần tự hóa và giải tuần tự hóa dữ liệu vì việc truyền thông báo là giao tiếp dựa trên văn bản. Quá trình này phát sinh chi phí hiệu suất và có thể ảnh hưởng đến hiệu suất tổng thể của ứng dụng.
  • Hỗ trợ trình duyệt: Mặc dù Công nhân web được hỗ trợ tốt trong hầu hết các trình duyệt web hiện đại, một số trình duyệt cũ hơn hoặc môi trường hạn chế có thể hỗ trợ một phần hoặc không hỗ trợ cho Công nhân web.

Đạt được tính song song thực sự trong JavaScript

Tính song song trong JavaScript là một khái niệm thú vị cho phép thực thi đồng thời các tác vụ thực sự, ngay cả trong ngôn ngữ đơn luồng chủ yếu. Với việc giới thiệu Công nhân web, bạn có thể khai thác sức mạnh của tính song song và đạt được những cải tiến đáng kể về hiệu suất trong các ứng dụng JavaScript của mình.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *