Giải thích về lập trình đa luồng, đồng bộ và bất đồng bộ

1. Lập trình đồng bộ (Synchronous programming)

Trong mô hình lập trình đồng bộ, một thread sẽ xử lý từng task một, sau khi xử lý xong task này mới được tiến hành xử lý task khác. Bạn có thể sử dụng đơn luồng hay đa luồng trong việc lập trình đồng bộ, như mô hình dưới đây

Một thread duy nhất (Đơn luồng)

Giả sử bạn là đầu bếp của một nhà hàng và phải nấu 4 món ăn là trứng, bánh mỳ, thịt bò & món tráng miệng. Bạn sẽ phải nấu từng món một, chờ trứng chín sau đó chuyển sang nướng bánh mỳ. Khi nào bánh mỳ chín thì bạn nấu thịt bò, chờ thịt bò chín bạn chuyển qua làm món tráng miệng.

Với cách làm này bạn sẽ thấy tốn rất nhiều thời gian đúng không ? Đương nhiên tốn thời gian thì khách hàng không hài lòng, trải nghiệm người dùng không được tốt sẽ khiến người dùng rời bỏ ứng dụng của chúng ta.

xử lý request thông qua 1 thread duy nhất

Nhiều thread (Đa luồng)

Vì làm theo 1 thread nên khách hàng chờ lâu quá không chịu nổi, bạn sẽ giảm thời gian nấu nướng xuống bằng cách thuê 4 đầu bếp (4 threads), mỗi ông nấu một món

nhiều thread cùng xử lý request

Mô hình 4 threads xử lý 4 tasks ở trên nhìn có vẻ rất lý tưởng, nhưng trong thực tế thì số lượng task sẽ luôn lớn hơn số lượng thread.  Điều này có nghĩa là 1 thread sẽ phải xử lý rất nhiều task. Hơn thế nữa nguồn lực của CPU, bộ nhớ là có hạn, bạn không phải muốn chia nhỏ bao nhiêu thread cũng được.

2. Lập trình bất đồng bộ (Asynchronous programming)

Trái với mô hình lập trình đồng bộ, ở mô hình này 1 thread có khả năng xử lý đồng thời nhiều task, nó sẽ lưu lại trạng thái của task hiện tại và tiến hành xử lý các task khác.

async - lập trình bất đồng bộ

Chúng ta sẽ sử dụng ví dụ nấu nướng ở trên để mình họa tiếp. Bây giờ ông đầu bếp sẽ tiến hành nấu trứng, đặt thời gian là 10 phút nữa nó chín. Xong sẽ chuyển qua nướng bánh mỳ, đặt thời gian lò vi sóng là 30 phút để bánh mỳ tự chín rồi chuyển qua làm việc khác. Bạn có thấy với cách làm này thời gian thực thi các task được rút ngắn hơn và với nguồn lực nhỏ hơn ?

Khi số lượng các task nhiều lên, chúng ta có thể áp dụng mô hình nhiều thread (đa luồng) vào đây, mỗi thread sẽ xử lý đồng thời nhiều task khác nhau

Nhiều thread xử lý nhiều task theo mô hình async

Như hình minh họa ở trên, chúng ta có thể thấy task T4, T5, T6 … được xử lý bởi nhiều thread khác nhau. T4 được xử lý đầu tiên bởi thread 1 và được hoàn tất tại thread 2. Tương tự như vậy, T6 được xử lý bởi 3 thread là Thread 2, Thread 3, Thread 4.

Quay lại với ví dụ nấu nướng, ông đầu bếp A sẽ nướng bánh và ông B sẽ bày bánh ra đĩa, ông C sẽ bưng ra đưa cho khách hàng.

Tham khảo : https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/