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ộ?

Threads
  • Có bạn nào trong lúc code mà bị "ngẫn tò te" hoặc "lú lẫn" trong mớ hỗn độn của mình viết ra chưa. Những lúc như thế tôi thường hay ngừng lại, thư giãn đầu óc, hoặc để mai tính tiếp. Ấy vậy mà rất hiệu quả nhé! Lúc sau xem lại cái tự nhiên thấy vấn đề ở đâu ngay.

    Hoặc cũng có thể thử áp dụng phương pháp "chú vịt vàng" - thử giải thích vấn đề đang gặp phải với vịt xem, nó sẽ cho thấy mâu thuẫn trong lời nói ra.

    Còn không có tiền mua vịt to thì xe túi mù ra vịt bé giống mình nè 😅

    » Xem thêm
  • Ơ buồn cười thật. Ai cũng biết GIF là định dạng ảnh động thường được dùng thay cho video clip để hiển thị các nội dung ngắn trên nền tảng web. GIF tiện hơn các nội dung dạng video là vì nó được hiển thị như một bức ảnh và được hỗ trợ rộng rãi. Cơ mà GIF có dung lượng nặng quá.

    Nói thật nhiều lúc mình có vài cái hành động muốn hiển thị lên web cho mọi người xem, cơ mà định dạng GIF nó nặng với cả cũng không biết cách tối ưu cho nhẹ xuống. Hôm nay lên mạng tìm hiểu xem định dạng nào có khả năng thay thế GIF trong tương lai thì mọi người biết đó là gì không? Là WEBP (webp)!!! Đúng vậy, là định dạng ảnh mà mình đang dùng trên blog lâu nay luôn á, mà giờ mới biết là nó hiển thị được cả ảnh động nữa, hơi quê 😆

    Kết hợp với ffmpeg nữa là chuyển được tất tần tật video clip thành webp được ngay. Để vài nửa ngồi chế lại cái cli một tí là dùng ngon luôn mọi người ạ 🤪

    » Xem thêm
  • Cảm giác như Github Copilot đang cố gắng mở rộng thị trường cho anh em developer á. Mới trước họ ra mắt Github Open Copilot Chat thì mới đây lại thêm cái Using GitHub Copilot in the command line dùng để giải thích hoặc gợi ý lệnh trong terminal.

    Đây, cách dùng rất đơn giản thôi, ví dụ muốn nó giải thích câu lệnh sudo apt-get để làm gì, thì:

    $ gh copilot explain "sudo apt-get"

    Hoặc nhờ nó gợi ý lệnh mong muốn, sử dụng tiếng Việt được luôn nhé (kể cả tiếng Việt không dấu vẫn hiểu 😳)

    $ gh copilot suggest "xoá commit chưa push"

    Mình đã kiểm tra và thấy lệnh ra rất đúng, xịn thật 🤓

    » 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.

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.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (0)

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