Lập Trình Đồng Bộ và Bất Đồng Bộ trong Dart
- 07-06-2024
- Toanngo92
- 0 Comments
Mục lục
Lập Trình Đồng Bộ trong Dart
Hãy xem xét một tình huống thực tế. Bạn đang nói chuyện điện thoại với ai đó. Trong thời điểm này, bạn không thể thực hiện cuộc gọi khác. Cuộc gọi tiếp theo chỉ có thể được thực hiện sau khi ngắt kết nối cuộc gọi hiện tại. Nhiệm vụ hiện tại ‘chặn’ nhiệm vụ tiếp theo không thể xảy ra cho đến khi nhiệm vụ hiện tại được hoàn thành.
Khái niệm này có thể được tiếp tục để hiểu về lập trình đồng bộ trong các ứng dụng. Việc thực hiện một quy trình phụ thuộc vào một quy trình khác. Hệ thống không thể thực hiện bất kỳ quy trình nào khác trừ khi quy trình đầu tiên đã hoàn thành.
Để giải thích đơn giản, một quy trình đồng bộ đợi cho một sự kiện hoặc thao tác được hoàn thành trước khi bắt đầu thực hiện một sự kiện hoặc quy trình khác.
Nhược điểm lớn nhất của quy trình như vậy là nó chặn quy trình hoặc mã cho đến khi quy trình trước đó đã được thực hiện hoàn toàn. Trong một kịch bản Máy chủ Web, yêu cầu đến từ người dùng khác sẽ bị chặn cho đến khi yêu cầu của người dùng trước đó được thực hiện. Đoạn mã bên dưới mô tả một ví dụ về phương thức không đồng bộ.
import 'dart:io';
void main() {
print("Nhập nơi sinh của bạn:");
String noiSinh = stdin.readLineSync();
print("Nơi sinh của bạn là $noiSinh");
}
Trong Đoạn mã trên, hàm readLineSync()
là một phương thức đồng bộ. stdin.readLineSync()
được sử dụng để nhận đầu vào từ người dùng bằng cách nhập thư viện dart. Hàm print()
được triển khai ở đây sẽ không được thực hiện cho đến khi đầu vào từ người dùng đã được nhận. Cuối cùng, nó sẽ in ra nơi sinh sử dụng hàm print()
nhận từ người dùng.
Lập Trình Bất Đồng Bộ trong Dart
Một phương thức bất đồng bộ thực thi trong một luồng không phải là luồng ứng dụng chính.
Để hiểu điều này, hãy xem xét một ví dụ.
Khi bạn đang nói chuyện điện thoại, bạn có thể gửi một tin nhắn cho một người đang cố gắng liên lạc với bạn. Không cần phải ngắt kết nối cuộc gọi hiện tại để gửi tin nhắn.
Tương tự, trong lập trình bất đồng bộ, việc thực thi của một quy trình không phụ thuộc vào quy trình khác.
Khi một thứ gì đó được thực thi bất đồng bộ, người dùng có thể tiếp tục sang một nhiệm vụ khác trước khi nó hoàn thành hoặc được thực thi. Lập trình bất đồng bộ sửa chữa chuỗi sự kiện trong một chu kỳ lập trình. Đoạn mã bên dưới thể hiện một ví dụ về một phương thức bất đồng bộ. Trước khi bắt đầu với mã, hãy tạo một tệp văn bản như sau:
Tệp names.txt
Jon
Dan
Ron
Ricky
import 'dart:io';
import 'dart:async';
void main() {
File file = new File(Directory.current.path + "\\names.txt");
Future<String> f = file.readAsString();
f.then((data) => print(data));
print("main ends here");
}
Một tệp văn bản được tạo trước với các tên ‘Jon’, ‘Dan’, ‘Ron’ và ‘Ricky’. Tệp này được lưu trong thư mục dự án với tên names.txt.
Trong Đoạn Mã trên, lớp Future
trong thư viện Dart được sử dụng để nhận kết quả của một tính toán sau khi nhiệm vụ bất đồng bộ đã được thực hiện hoặc được thực thi. Dart chứa kiểu dữ liệu File và phương thức readAsString()
để đọc nội dung của tệp. Phương thức này là bất đồng bộ, nó mất thời gian để mở và đọc dữ liệu từ tệp. Do đó, hàm print()
với ‘main ends here
‘ được thực thi trước khi kịch bản đọc tệp ‘names.txt
‘ và in dữ liệu bên trong nó.
Sau khi dữ liệu bên trong tệp ‘names.txt
‘ được đọc, hàm then()
được thực thi để in dữ liệu bên trong tệp ‘names.txt
‘. Bằng cách sử dụng từ khóa await
trước hàm then()
, dòng in tiếp theo sẽ không được thực thi cho đến khi hàm then()
hoàn thành.
Lập Trình Bất Đồng Bộ với Từ khóa Future
Từ khóa Future được sử dụng để nhận giá trị đôi khi trong tương lai. Hàm bất đồng bộ trả về Future, chứa kết quả.
Các đối tượng Future là một cơ chế để biểu diễn các giá trị được trả về bởi một biểu thức mà thực thi sẽ hoàn thành tại một điểm thời gian sau này.
Hàm Future
có ba trạng thái:
- Chưa hoàn thành: Trong trạng thái này, kết quả đã đóng.
- Hoàn thành với giá trị: Trong trạng thái này, kết quả đã mở và dữ liệu sẵn sàng.
- Hoàn thành với lỗi: Trong trạng thái này, kết quả đã mở và có một lỗi xảy ra.
a. Giá trị Future
Hàm Future
value tạo ra một future với giá trị. Nếu giá trị là một future, future được tạo ra sẽ chờ giá trị thực thi và sau đó, nó sẽ được thực thi với cùng một kết quả. Đoạn mã bên dưới là một ví dụ về Future
value.
import 'dart:async';
void main() {
var myFutureVal = Future.value(14);
print(myFutureVal);
}
Trong đoạn mã trên, myFutureVal
là một biến với giá trị future là 14. Mã này sẽ ở trạng thái chưa hoàn thành vì không có await
được sử dụng để in ra giá trị. Do đó, kết quả sẽ là “Instance of ‘Future<int>'”.
b. Future error
Hàm Future error tạo ra một future, hoàn thành với một lỗi. Đoạn mã 4 minh họa một ví dụ về Future error.
import 'dart:async';
void main() {
Future<int> getFuture() {
return Future.error("This is an error");
}
getFuture();
}
Trong đoạn mã trên, hàm Future
được tạo ra để trả về một giá trị kiểu int. Bên trong hàm, Future error ‘This is an error’ được trả về.
c. Future delayed
Hàm Future delayed
tạo ra một future, thực thi tính toán của nó sau một khoảng thời gian chờ đợi. Future delay luôn hoạt động với một khoảng thời gian nhất định. Tính toán sẽ được thực thi sau khi đã trôi qua một khoảng thời gian nhất định. Đoạn mã bên dưới là một ví dụ về Future delay
.
import 'dart:async';
void main() {
Future.delayed(Duration(milliseconds: 10000), () {
print("This is a delayed future");
});
}
Trong đoạn mã trên, Future.delayed
được gọi với một khoảng thời gian là 10000 mili giây. Hàm print()
sẽ được gọi sau một độ trễ là 10000 mili giây.
Lập trình bất đồng bộ với từ khóa Async
Từ khóa async
được sử dụng khi khai báo một hàm là bất đồng bộ. Từ khóa async được thêm sau tên của hàm. Khi một hàm bất đồng bộ được gọi, một Future được trả về và hàm được thực thi.
Cú pháp:
Function_name() async {
// something
}
Lập trình bất đồng bộ với từ khóa Await
Từ khóa await
chỉ được sử dụng trên hàm bất đồng bộ. Từ khóa await
giữ hàm hiện đang chạy cho đến khi kết quả sẵn sàng. Nếu kết quả sẵn sàng, thì nó tiếp tục thực thi từ dòng mã tiếp theo. Đoạn mã bên dưới minh họa một ví dụ về từ khóa await
.
import 'dart:async';
void main() async {
await demo();
print("Have a great day!");
}
Future<void> demo() async {
print("Good Morning");
}
Trong đoạn mã trên, sau khi tạo hàm main()
, một hàm mới demo()
được tạo. Sau đó, từ khóa async
phải được sử dụng trong demo()
, ‘Good Morning’ được in ra. Từ khóa await
được sử dụng bên trong hàm main()
. Hàm demo()
được gọi trong hàm main()
. Cuối cùng, các giá trị được in ra trong console.
Good Morning
Have a great day!
Process finished with exit code 0
Ưu và Nhược điểm của Lập trình Đồng bộ và Bất đồng bộ
Lập trình đồng bộ và lập trình bất đồng bộ được phân loại vào hai phong cách lập trình khác nhau, với những ưu điểm và nhược điểm riêng. Quan trọng là hiểu biết sự khác biệt giữa hai phong cách này để đánh giá các yêu cầu lập trình và chọn lựa giải pháp tốt nhất cho hoạt động phần mềm vì không có một phong cách lập trình nào là tốt nhất.
Ưu điểm của lập trình đồng bộ
- Lập trình đồng bộ được hỗ trợ trong tất cả các ngôn ngữ lập trình.
- Các chương trình dễ viết hơn.
- Các chương trình đồng bộ đáng tin cậy vì lỗi có thể được phát hiện và xử lý trước khi gây ra thiệt hại đáng kể.
Nhược điểm của lập trình đồng bộ
- Thời gian tải chương trình chậm.
- Khi một luồng bị khóa, các luồng đang ở trong hàng đợi cũng bị chặn.
- Yêu cầu một số lượng tài nguyên đáng kể.
- Yêu cầu nhiều luồng hơn để xử lý nhiều yêu cầu.
Ưu điểm của lập trình bất đồng bộ
- Trong lập trình bất đồng bộ, ứng dụng có thể tiếp tục thực thi trong khi một hàm bất đồng bộ thực hiện nhiệm vụ của nó.
- Lập trình bất đồng bộ tải toàn bộ chương trình cùng một lúc.
- Lập trình bất đồng bộ giảm thiểu độ trễ tải trang.
- Các hàm gọi lại giúp thực thi dòng mã tiếp theo nếu xảy ra lỗi trong quá trình thực thi chương trình bất đồng bộ.
- Các từ khóa async và await có cú pháp cấu trúc phổ biến của các ngôn ngữ lập trình, giúp các hàm bất đồng bộ làm việc với các promise một cách thuận tiện.
Nhược điểm của lập trình bất đồng bộ
- Lập trình bất đồng bộ phức tạp khi viết.
- Nhà phát triển cần có kiến thức về các hàm gọi lại và hàm đệ quy.
- Thời gian hiển thị một trang mất thời gian trong lập trình bất đồng bộ.
- Nếu có quá nhiều yêu cầu bất đồng bộ, nó có thể làm quá tải máy chủ và thực thi chương trình sẽ chậm.