Lập trình bất đồng bộ là gì? Tại sao JavaScript là ngôn ngữ lập trình bất đồng bộ?

Lập trình bất đồng bộ là gì? Tại sao JavaScript là ngôn ngữ lập trình bất đồng bộ?

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » Xem thêm

Vấn đề

JavaScript là một ngôn ngữ lập trình bất đồng bộ - điều đó ai mà chẳng biết chứ. Hoạt động bất đồng bộ thể hiện rõ nhất qua các hàm bất đồng bộ, tức là các hàm không trả lại kết quả ngay lập tức mà nó sẽ trả về trong một thời điểm "nào đó".

Nếu xuất thân từ một lập trình viên PHP, Go hay thậm chí là Java... có thể bạn chưa nghe hoặc đang còn mơ hồ về khái niệm lập trình bất đồng bộ là như thế nào. Có thể bạn sẽ đặt ra ra câu hỏi là tại sao JavaScript lại là ngôn ngữ bất đồng bộ, liệu nó mang lại lợi ích hay hạn chế gì cho ngôn ngữ này.

Bài viết ngày hôm nay, tôi sẽ phân tích về việc tại sao JavaScript lại là ngôn ngữ bất đồng bộ. Hay nói cách khác là vì sao nó "nên" là ngôn ngữ lập trình bất đồng bộ.

Lập trình bất đồng bộ là gì?

Lập trình bất đồng bộ (Asynchronous Programming) là một phương pháp lập trình cho phép các tác vụ được thực hiện độc lập và song song mà không cần chờ đợi các tác vụ khác hoàn thành trước đó. Thay vì đợi cho đến khi một tác vụ hoàn thành và trả về kết quả trước khi bắt đầu tác vụ tiếp theo, lập trình bất đồng bộ cho phép các tác vụ đang chạy cùng một lúc, điều này giúp cải thiện hiệu suất và thời gian phản hồi.

Trong JavaScript, lập trình bất đồng bộ thể hiện ở các hàm bất đồng bộ, trả lại kết quả thông qua các hàm Callback, Promise, async/await, Event listeners... Ví dụ như các cuộc gọi API được thực hiện bất đồng bộ, các sự kiện từ phía người dùng (move, click, focus...) cũng thế... Tương tự, trong môi trường Node.js chúng ta có các truy vấn đến cơ sở dữ liệu, thao tác với các tệp tin... cũng là những hành động bất đồng bộ.

Tại sao JavaScript là bất đồng bộ?

JavaScript ban đầu được thiết kế để chạy trên trình duyệt thông qua các ứng dụng web. Vì đặc thù của trình duyệt cho nên JavaScript phải được thiết kế theo hướng bất đồng bộ để tăng hiệu suất.

Hãy thử hình dung tình huống giả sử JavaScript chạy đồng bộ, khi trang web đang được tải và trong quá trình xử lý hiển thị cho người dùng xem thì một lệnh Ajax gọi đến một máy chủ nào đó để lấy dữ liệu về. Khi đó quá trình render sẽ bị "tạm dừng" để chờ kết quả. Sẽ ra sao nếu mạng chậm hoặc máy chủ phản hồi lâu? Trang web sẽ không thể hoạt động một cách bình thường chỉ vì nó phải chờ đợi các hàm mất "nhiều thời gian".

Thật may, cuộc gọi Ajax là một hoạt động bất đồng bộ, cho nên quá trình render vẫn có thể diễn ra bình thường.

Các ứng dụng web là tổ hợp các sự kiện của người dùng. Họ lướt chuột, cuộn lên cuộn xuống trang web, bấm vào nút, nhập nội dung... Để xử lý được, JavaScript phải tạo ra cơ chế "lắng nghe" (Event listeners) sự kiện để thực hiện một tác vụ tương ứng khi nó xảy ra. Điều này không thể nào diễn ra ở lập trình đồng bộ được. Cơ chế Event listeners cho phép lập trình viên tạo ra các hàm xử lý và nó sẽ được gọi khi một hành động nào đó của người dùng diễn ra.

Nhờ thế mà ngày nay chúng ta có nhiều Framework lập trình bất đồng bộ rất tốt được ra đời như Node.js, Angular và React, giúp lập trình viên phát triển các ứng dụng web hiệu quả và tăng tốc độ phản hồi của ứng dụng.

Nói tóm lại, JavaScript "nên" được thiết kế theo kiểu bất đồng bộ để đáp ứng nhu cầu của các ứng dụng web hiện đại, cải thiện hiệu suất và tương thích tốt với cấu trúc của trình duyệt.

Ưu nhược điểm

Một trong những ưu điểm lớn nhất của lập trình bất đồng bộ đó là tăng hiệu suất cho các ứng dụng, tăng tốc độ thực thi của các tác vụ trong ứng dụng bằng cách cho phép chúng được thực hiện song song mà không phải chờ đợi các tác vụ khác hoàn thành trước đó. Các tác vụ có thể được thực hiện mà không phải chặn luồng chính của ứng dụng, tránh bị treo máy.

Với bất đồng bộ, các tác vụ lớn có thể được chia nhỏ thành các phần nhỏ hơn và được thực hiện đồng thời. Điều này giúp tăng hiệu suất và giảm thời gian thực hiện cho các tác vụ lớn.

Bên cạnh đó lập trình bất đồng bộ cũng mang lại một số phiền hà nhất định. Đầu tiên là khả năng tiếp cận, làm quen với phong cách bất đồng bộ này, có thể mất một thời gian để hiểu được concept lẫn phong cách của nó.

Khó khăn trong việc xử lý lỗi và cả gỡ lỗi. Vì các tác vụ được thực hiện đồng thời, cho nên nếu một tác vụ lỗi, các tác vụ khác vẫn chạy bình thường, việc xử lý lỗi lúc này có phần phức tạp hơn. Hoặc nếu tác vụ chồng chéo nhay, việc truy vết lỗi cũng mang lại nhiều khó khăn.

Cho dù lập trình đồng bộ hay là bất đồng bộ đều đòi hỏi khả năng quản lý tài nguyên chia sẻ. Đối với bất đồng bộ, nhiều tác vụ đồng thời có thể đang cùng truy cập vào tài nguyên dùng chung, cho nên phải có phương án hoặc kĩ năng giải quyết để tránh xung đột.

Tổng kết

Lập trình bất đồng bộ là một phương pháp lập trình cho phép các tác vụ được thực hiện độc lập và song song mà không cần chờ đợi các tác vụ khác hoàn thành trước đó. JavaScript là một ngôn ngữ lập trình bất đồng bộ, điều này mang lại cho nó nhiều "lợi thế" trong môi trường trình duyệt. Không những thế, Node.js cũng tận dụng được sức mạnh của bất đồng bộ để tạo ra máy chủ có hiệu suất cao. Bên cạnh đó, bất đồng bộ cũng mang lại một số khó khăn nhất định sự thời gian làm quen ban đầu, quá trình xử lý lỗi và quản lý tài nguyên dùng chung.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...