Bất đồng bộ Asynchronous trong lập trình

Trong lập trình, bất đồng bộ hay không đồng bộ là một khái niệm quen thuộc và được sử dụng để xử lý các tác vụ xảy ra bên ngoài luồng thực thi chính của chương trình. Việc hiểu bất đồng bộ hoạt động và cách sử dụng nó một cách hiệu quả rất quan trọng để xây dựng các hệ thống phần mềm ít lỗi, dễ maintain, mở rộng.

Bất đồng bộ Asynchronous trong lập trình
Bất đồng bộ Asynchronous trong lập trình

Trong bài viết này, chúng ta sẽ khám phá những kiến thức cơ bản về lập trình bất đồng bộ và cách thức hoạt động của nó trong các ngôn ngữ lập trình.

Nó là cái gì thế nhỉ?

Lập trình bất đồng bộ là một mô hình lập trình cho phép chương trình thực hiện các câu lệnh, tác vụ theo cách non-blocking(hiểu một cách đơn giản thì Non-Blocking là các câu lệnh trong khối/hàm không nhất thiết phải chạy tuần tự, trái ngược với blocking, câu lệnh đứng trước chạy xong mới chạy tới câu tiếp theo. Xem thêm về blocking, non-block tại đây). Nói theo cách khác, lập trình không đồng bộ cho phép một chương trình tiếp tục chạy mà không cần chờ một hành động khác hoàn thành.

Ví dụ

async function createUser(data) {
  try {
    const response = await save_to_database(data); // Lệnh 1
    send_email(); // Lệnh 2
    save_to_log(respone) // Lệnh 3
    notify() // lệnh 4
    return response;
  } catch (error) {
    console.error('Error create user:', error);
  }
}

Ở ví dụ này tôi có hàm tạo User trên app, sau khi người dùng bấm đăng ký tôi gọi hàm createUser nó thực hiện các bước sau:

  • Lệnh 1: lưu user vào database, trong lệnh này có await tức là hàm này sẽ đợi lưu dữ liệu vào database xong mới chạy tới lệnh 2.
  • Lệnh 2 chạy, tuy nhiên chưa biết có gửi được email hay không hàm chạy tiếp tới lệnh 3, lệnh 3 cũng không biết có chạy xong chưa thì chương trình chạy tiếp tới lệnh 4 và trả kết quả về cho người dùng.

Lý do là vì, lệnh 2 3 4 là những lệnh không quan trọng với người dùng, sau khi tạo user thành công, cần nhanh chóng trả kết quả về app cho người dùng, không để họ phải đợi. Ở đây tôi chỉ ví dụ để bạn hiểu, chứ thực tế người ta không viết thế này, mà các tác vụ như gửi mail, lưu log, hay notify thì họ sẽ bắn một event cho server xử lý.

async function fetchUserData(userId) {
  try {
    const response = await fetch(`https://api.example.com/users/${userId}`);
    const userData = await response.json();
    return userData;
  } catch (error) {
    console.error('Error fetching user data:', error);
  }
}

Ví dụ 2 là một khối lệnh chạy blocking, tuần tự từ trên xuống, chương trình sẽ đợi lệnh 1 lấy dữ liệu người dùng từ api xong, rồi mới lấy kết quả trả về cho người dùng.

Cách hoạt động

Tùy ngôn ngữ lập trình sẽ có các cách sử dụng khác nhau, tuy nhiên trong nhiều ngôn ngữ, bất đồng bộ được triển khai bằng cách sử dụng callbacks, promises, hay async/await.

Callback: đúng như nghĩa của nủa nó “gọi lại” là các hàm được truyền dưới dạng đối số cho các hàm khác và được thực thi khi hàm ban đầu hoàn thành.

Promises: là các đối tượng đại diện cho việc hoàn thành (hoặc thất bại) cuối cùng của một thao tác không đồng bộ và cho phép bạn xử lý kết quả của thao tác bằng phương thức then.

Async/await: là cú pháp cho phép bạn viết code không đồng bộ trông giống như mã đồng bộ. Async/await thường được sử dụng trong các framework phát triển web hiện đại như Node.js và React.

Lợi ích

Lập trình không đồng bộ mang lại một số lợi ích như

Cải thiện hiệu suất: cho phép chương trình thực hiện các tác vụ theo cách non-blocking, bỏ qua một số lệnh không cần thiết, qua đó cải thiện hiệu suất tổng thể và khả giảm thời gian phản hồi của chương trình.

Khả năng mở rộng: dễ dàng xây dựng các hệ thống phần mềm có thể mở rộng, có thể xử lý một số lượng lớn người dùng và yêu cầu đồng thời, mọi người sẽ cảm nhận rõ điều này khi làm việc với các hệ thống có lượng truy cập lớn.

Trải nghiệm người dùng tốt hơn: cải thiện trải nghiệm người dùng của các ứng dụng bằng cách giảm thời gian ứng dụng phản hồi các yêu cầu của người dùng, hệ quả của lợi ích cải thiện hiệu suất.

Kết luận

Lập trình không đồng bộ là một khái niệm cực kỳ quan trọng trong phát triển phần mềm hiện đại và hiểu cách thức hoạt động cũng như cách sử dụng nó một cách hiệu quả là rất quan trọng để xây dựng các hệ thống phần mềm mạnh mẽ, dễ mở rộng.

Total
1
Shares
Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Previous Post

Hiểu tâm lý con gái khi yêu xa, bạn trai nên?

Next Post

5 công cụ Data Scraping mạnh mẽ

Related Posts