thắc mắc Concurrency, Parallel, Asynchronous, Multithreading khác nhau như thế nào?

  • Người tạo chủ đề Người tạo chủ đề o0alvin0o
  • Ngày bắt đầu Ngày bắt đầu
Mình hiểu đại khái thế này với context Java:
Đầu tiên program sẽ chạy trên 1 thread (vd public static void main() method).

Asynchronous: mình tạo và push message lên Message Queue, để service khác consume. Thread hiện tại vẫn chạy bình thường và không bị block.

Synchronous: Khi mình tạo và post message qua REST endpoint (vd với RestTemplate hay WebClient), thì thread hiện tại sẽ ngừng lại và đợi kết quả từ REST endpoint call.

Multithreading: Nếu không muốn đợi REST endpoint call, thì mình sẽ viết thêm code để call REST endpoint với 1 thread khác (vd Thread/Runnable, Future/Callable, CompletableFuture, ExcecutorService). Lúc này có thể coi là multithreading và asynchronous. (Sau đấy có thể dùng Thread.join()/Future.get() để lấy kết quả và tiếp tục process.)

Concurrency: 1 CPU chỉ có thể xử lí được 1 thread ở 1 thời điểm. Nếu CPU chỉ có 1 core, thì lúc này không được coi là parallel mà chỉ coi là concurrency (nhiều task chạy và kết thúc trong các khoảng thời gian trùng lặp).

Parallel: Nếu CPU có 2 core trở lên thì lúc này code được coi là parallel vì mỗi core có thể xử lí 1 thread.
Cách hiểu về Asynchronous như này theo mình nghĩ là rất chuẩn, và JS thì nó cũng như thế,
Asynchronous trong ngữ cảnh của bạn là đẩy qua cho service khác xử lý, còn đối với JS thì nó sẽ đẩy vào WebAPI (của browser) để xử lý, còn đối với NodeJS thì nó sẽ đẩy vào C++ API (của chính nó - node server) để xử lý

Như vậy, quay về JS chạy trên browser, thực tế các task chạy async hoàn toàn có thể chạy multithread với nhau với WebAPI
 
Sửa lần cuối:
Toy hiểu đơn giản như này.
Lấy ví dụ là nấu cơm, canh đi. Với 1 người làm tương đương CPU 1 core 1 process.
Concurrent:
- Nấu cơm -> Đợi Cơm chín -> Nấu Canh -> Đợi canh chín => Xong
Parallel:
- Nấu cơm -> Nấu Canh -> Đợi cơm chín -> Đợi canh chín => Xong
 
Toy hiểu đơn giản như này.
Lấy ví dụ là nấu cơm, canh đi. Với 1 người làm tương đương CPU 1 core 1 process.
Concurrent:
- Nấu cơm -> Đợi Cơm chín -> Nấu Canh -> Đợi canh chín => Xong
Parallel:
- Nấu cơm -> Nấu Canh -> Đợi cơm chín -> Đợi canh chín => Xong
Khá vui, xin đc bổ sung góp vui
Giả sử 1 con người là 1 core
1. Concurrent:
- (Chủ quán) Nấu cơm -> Chờ cơm chín -> Nấu Canh -> Chờ canh chín => Xong
2. Multithread:
- (Chủ quán) Nấu cơm -> (ko cần chờ cơm chín) Nấu canh -> Chờ cho cả 2 cùng chín -> Xong
3. Async
- Bồi bàn đặt món cơm + canh -> Đầu bếp A làm món (có thể là Concurrent hoặc Multithread tùy vào cách bếp quản lý, hoặc Parallel nếu có nhiều đầu bếp) -> Xong cái nào thì trả món cho bồi bàn
4. Await
- Bồi bàn chờ bếp trả món
5. Parallel:
  • ở mục 1 và 2: Sẽ có 2 người đồng chủ quán, mỗi người làm 1 món rồi dọn ra cho khách
  • ở mục 3: Trong bếp có nhiều đầu bếp, mỗi ông sẽ làm 1 món thay vì chỉ để ông A làm ở chế độ "multithread"
  • ở mục 3: Sẽ có nhiều bồi bàn để có thể nhận đặt nhiều bàn cùng 1 lúc
 
Vấn đề của thớt đòi hỏi kiến thức khá sâu và rộng để hiểu rốt ráo, gồm kiến thức về hệ điều hành để hiểu bản chất process/thread nói chung và kiến thức về JVM để hiểu cách máy tính chạy một chương trình java
Hồi xưa tôi cũng giống thớt, đọc comment stackoverflow các kiểu vẫn lơ mơ, lời khuyên là kiếm sách đọc tuần tự và đối chiếu với công việc đang làm. Diễn đàn mỗi người trình bày một cách mà toàn ở mức tóm tắt rất nông, người này lặp lại câu trả lời na ná người kia
d6gqaQL.png
 
Em có thể giải thích cho bác về Async như sau

Cái nhìn tổng quát về Async IO​

Async IO ít được biết đến hơn so với những thuật ngữ quen thuộc của lập trình cổ điển mà ta đã từng học, thực hành và kiểm nghiệm (multiprocessing threading). Phần này sẽ cung cấp cho bạn bức tranh đầy đủ hơn về async IO (lập trình bất đồng bộ) là gì và cách chúng được sử dụng cho các trường hợp cụ thể.

Async IO được dùng ở đâu​

Tính đồng thời (concurrency) và tính song song (parallelism) là những topic mở rộng không dễ để tìm hiểu. Mặc dù bài viết này tập trung vào async IO và cách triển khai nó trong Python, nhưng bạn cũng nên dành một phút để so sánh async IO với các “cộng sự của nó” để có được cái nhìn bao quát về cách dùng nó phù hợp trong những bài toán lớn.

parallelism bao gồm việc thực hiện nhiều hành động trong cùng một lúc. Multiprocessing được hiểu là việc thực hiện các tác vụ song song và nó đòi hỏi phải chia sẻ các tác vụ đó cho các đơn vị xử lý trung tâm (cores). Multiprocessing rất phù hợp cho các tác vụ liên quan đến CPU: Như việc thực hiện for-loop hàng loạt và các phép tính toán học thường thuộc loại này.

concurrency là một thuật ngữ mở rộng của parallelism. Bạn có thể hiểu nó theo nghĩa là một tác vụ có thể chạy thay nhau cùng lúc (cái này chạy một chút rồi đến cái kia chạy một chút - thuật ngữ này gọi là overlapping manner). Và lưu ý rằng đồng thời (concurrency) không có nghĩa là song song (parallelism).

Threading là một mô hình thực thi concurrency mà ở đó nhiều luồng thay phiên nhau thực thi các tác vụ. Một process có thể chứa nhiều thread. Python thực hiện một complicated relationship với threading thông qua GIL, nhưng ta sẽ không nói tới trong bài viết này.

Điều quan trọng cần biết về threading là nó sẽ tốt hơn cho các tác vụ có IO. Trong khi các tác vụ CPU được đặc trưng bởi các core máy tính làm việc liên tục từ đầu đến cuối, thì các tác vụ có liên quan tới IO lại bị chi phối rất nhiều vào thời gian đợi input/output để hoàn thành.

Tóm cái váy lại, concurrency bao gồm cả multiprocessing (tốt cho các tác vụ cần CPU) và threading (cho các tác vụ có IO). Multiprocessing là một dạng parallelism mà ở đó parallelism là tập con của concurrency. Thư viện chuẩn của Python có cung cấp các package multiprocessing, threading và concurrent.futures để hỗ trợ cả hai thứ trên.

Giờ đã đến lúc đưa một thành viên mới vào danh sách này. Trong vài năm qua một thiết kế riêng biệt đã được tích hợp toàn diện hơn vào CPython: asynchronous IO, có thể được gọi thông qua package asyncio trong bộ thư viện chuẩn và các keyword async và await. Để rõ ràng, async IO không phải là một khái niệm mới được phát minh và nó đã tồn tại hoặc đang được tích hợp vào các ngôn ngữ và runtime environment như Go, C#, Scala.

asyncio package được Python documentation ví như là một thư viện để viết code concurrent. Tuy nhiên, async IO không phải là threading, cũng không phải là multiprocessing. Nó không được xây dựng dựa trên hai thứ này.

Thực tế, async IO là một thiết kế single-threaded, single-process: nó sử dụng cooperative multitasking (hợp tác đa nhiệm), một thuật ngữ mà bạn sẽ hiểu rõ khi đọc xong bài này. Nói cách khác async IO mang lại cảm giác như là concurrency (chạy đồng thời) mặc dù sử dụng single-thread trong một single process. Coroutines (một tính năng trung tâm của async IO) có thể được lên lịch đồng thời, nhưng chúng vốn dĩ không đồng thời.

Nhắc lại lần nữa, async IO là một kiểu lập trình concurrent, nhưng nó không phải là parallelism. Nó giống threading hơn là multiprocessing nhưng rất khác biệt so với cả hai thứ này và là một công cụ độc lập trong các công cụ lập trình lập trình concurrency.

Và một thuật ngữ nữa xuất hiện. Nó có nghĩa là gì khi một thứ gì đó bất đồng bộ (asynchronous)? Đây không phải là một định nghĩa cụ thể. Nhưng với mục đích của bài viết này, ta có thể hiểu nó với hai thuộc tính sau:
  • Các tiến trình bất đồng bộ có thể “tạm dừng” trong khi chờ đợi kết quả cuối cùng của chúng và để các tiến trình khác chạy trong lúc nó chờ.
  • Code bất đồng bộ thông qua cơ chế trên tạo ra một hiệu ứng thực thi đồng thời. Nói cách khác, code bất đồng bộ cho ta cảm giác như nó đang concurrency.

Dưới đây là sơ đồ tổng quát. Các thuật ngữ màu trắng đại diện cho các khái niệm và các thuật ngữ màu xanh lá cây biểu thị các cách thức mà chúng được triển khai hoặc thực hiện:
Concurrency versus parallelism

Ta sẽ dừng lại ở việc so sánh giữa các mô hình lập trình đồng thời. Bài viết này tập trung vào thành phần con của async IO, cách sử dụng chúng và những API có trong nó. Để tìm hiểu thêm về sự khác biệt giữa threading, multiprocessing và async IO, hãy dừng lại ở đây và xem bài viết tổng quan về concurrency trong Python của Jim Anderson.

Giải thích về Async IO​

Async IO thoạt đầu nghe có vẻ vô lý. Làm thế nào mà một thứ gì đó có thể giúp code chạy đồng thời mà chỉ sử dụng một thread và một CPU core? Tôi (tác giả) chưa bao giờ là người giỏi ra ví dụ, vì thế tôi muốn cho các bạn xem một câu từ bài nói chuyện của Miguel Grinberg tại PyCon năm 2017, giải thích mọi thứ khá hay như sau:

Vua cờ Judit Polgár tổ chức một cuộc triển lãm cờ vua trong đó cô ấy chơi với nhiều kỳ thủ nghiệp dư. Cô ấy có hai cách tiến hành: đồng bộ và không đồng bộ.

Giả sử:
  • 24 đối thủ
  • Judit thực hiện 1 nước cờ trong 5 giây
  • Đối thủ thì mất 55 giây để thực hiện một bước
  • Một ván trung bình có 30 nước di chuyển đôi (tổng cộng là 60 lần qua lại giữa hai người)

Giải pháp đồng bộ: Judit chơi một ván mỗi lần, không bao giờ chơi hai ván cùng lúc, cho đến khi xong. Mỗi ván mất (55+5) * 30 == 1800 giây, hay 30 phút. Suy ra chơi với toàn bộ 24 người sẽ mất 24 * 30 == 720 phút, hay 12 giờ.

Giải pháp không đồng bộ: Judit chơi từ bàn này sang bàn khác, thực hiện một lần di chuyển trên từng bàn cờ. Nhân lúc đối thủ suy nghĩ để thực hiện bước đi kế tiếp thì trong thời gian đợi đó cô ấy đi qua bàn khác để đi nước tiếp theo. Để thực hiện một lần đi cờ trên cả 24 bàn Judit mất 24 * 5 == 120 giây, hay 2 phút. Suy ra toàn bộ ván cờ cho tất cả 24 bàn cờ sẽ mất 3600 giây, hay 1 giờ.

Chỉ với một Judit Polgar, người chỉ có hai tay và chỉ thực hiện một nước đi mỗi lần. Nhưng bằng cách chơi không đồng bộ đã giúp giảm thời gian của cuộc đấu xuống từ 12 giờ còn 1 giờ. Vì vậy, cooperative multitasking (hợp tác đa nhiệm) là một cách nói fancy ý chỉ về event loop (vòng lặp sự kiện) của chương trình (điều này sẽ nói sau) thực hiện giao tiếp với nhiều task cho phép từng task thay phiên nhau chạy vào những thời điểm rảnh rỗi của CPU.

Trong Async IO, khi một function bị block thì async IO sẽ cho các chương trình khác chạy trong thời gian block đó (một function block những function khác từ khi nó bắt đầu đến khi nó return kết quả - thời gian block đó thường được biết đến với thuật ngữ Độ phức tạp thuật toán).

Trên là trích từ bài dịch của mình khi còn học đại học về Async IO trong Python. Bị Viblo cướp trắng trợn nên cũng hết muốn dịch mà toàn giữ riêng cho mình. Sau khi đi làm được gần 1 năm, bị kêu đi nghĩa vụ nên nghỉ việc dọn về, về thì biết tin dự bị nên quay lại Đà Nẵng :) Đang thất nghiệp, sẵn tiện ôn bài để đi phỏng vấn thì gặp post của bác. Mong giúp ích.
 
Em có thể giải thích cho bác về Async như sau

Cái nhìn tổng quát về Async IO​

Async IO ít được biết đến hơn so với những thuật ngữ quen thuộc của lập trình cổ điển mà ta đã từng học, thực hành và kiểm nghiệm (multiprocessing threading). Phần này sẽ cung cấp cho bạn bức tranh đầy đủ hơn về async IO (lập trình bất đồng bộ) là gì và cách chúng được sử dụng cho các trường hợp cụ thể.

Async IO được dùng ở đâu​

Tính đồng thời (concurrency) và tính song song (parallelism) là những topic mở rộng không dễ để tìm hiểu. Mặc dù bài viết này tập trung vào async IO và cách triển khai nó trong Python, nhưng bạn cũng nên dành một phút để so sánh async IO với các “cộng sự của nó” để có được cái nhìn bao quát về cách dùng nó phù hợp trong những bài toán lớn.

parallelism bao gồm việc thực hiện nhiều hành động trong cùng một lúc. Multiprocessing được hiểu là việc thực hiện các tác vụ song song và nó đòi hỏi phải chia sẻ các tác vụ đó cho các đơn vị xử lý trung tâm (cores). Multiprocessing rất phù hợp cho các tác vụ liên quan đến CPU: Như việc thực hiện for-loop hàng loạt và các phép tính toán học thường thuộc loại này.

concurrency là một thuật ngữ mở rộng của parallelism. Bạn có thể hiểu nó theo nghĩa là một tác vụ có thể chạy thay nhau cùng lúc (cái này chạy một chút rồi đến cái kia chạy một chút - thuật ngữ này gọi là overlapping manner). Và lưu ý rằng đồng thời (concurrency) không có nghĩa là song song (parallelism).

Threading là một mô hình thực thi concurrency mà ở đó nhiều luồng thay phiên nhau thực thi các tác vụ. Một process có thể chứa nhiều thread. Python thực hiện một complicated relationship với threading thông qua GIL, nhưng ta sẽ không nói tới trong bài viết này.

Điều quan trọng cần biết về threading là nó sẽ tốt hơn cho các tác vụ có IO. Trong khi các tác vụ CPU được đặc trưng bởi các core máy tính làm việc liên tục từ đầu đến cuối, thì các tác vụ có liên quan tới IO lại bị chi phối rất nhiều vào thời gian đợi input/output để hoàn thành.

Tóm cái váy lại, concurrency bao gồm cả multiprocessing (tốt cho các tác vụ cần CPU) và threading (cho các tác vụ có IO). Multiprocessing là một dạng parallelism mà ở đó parallelism là tập con của concurrency. Thư viện chuẩn của Python có cung cấp các package multiprocessing, threading và concurrent.futures để hỗ trợ cả hai thứ trên.

Giờ đã đến lúc đưa một thành viên mới vào danh sách này. Trong vài năm qua một thiết kế riêng biệt đã được tích hợp toàn diện hơn vào CPython: asynchronous IO, có thể được gọi thông qua package asyncio trong bộ thư viện chuẩn và các keyword async và await. Để rõ ràng, async IO không phải là một khái niệm mới được phát minh và nó đã tồn tại hoặc đang được tích hợp vào các ngôn ngữ và runtime environment như Go, C#, Scala.

asyncio package được Python documentation ví như là một thư viện để viết code concurrent. Tuy nhiên, async IO không phải là threading, cũng không phải là multiprocessing. Nó không được xây dựng dựa trên hai thứ này.

Thực tế, async IO là một thiết kế single-threaded, single-process: nó sử dụng cooperative multitasking (hợp tác đa nhiệm), một thuật ngữ mà bạn sẽ hiểu rõ khi đọc xong bài này. Nói cách khác async IO mang lại cảm giác như là concurrency (chạy đồng thời) mặc dù sử dụng single-thread trong một single process. Coroutines (một tính năng trung tâm của async IO) có thể được lên lịch đồng thời, nhưng chúng vốn dĩ không đồng thời.

Nhắc lại lần nữa, async IO là một kiểu lập trình concurrent, nhưng nó không phải là parallelism. Nó giống threading hơn là multiprocessing nhưng rất khác biệt so với cả hai thứ này và là một công cụ độc lập trong các công cụ lập trình lập trình concurrency.

Và một thuật ngữ nữa xuất hiện. Nó có nghĩa là gì khi một thứ gì đó bất đồng bộ (asynchronous)? Đây không phải là một định nghĩa cụ thể. Nhưng với mục đích của bài viết này, ta có thể hiểu nó với hai thuộc tính sau:
  • Các tiến trình bất đồng bộ có thể “tạm dừng” trong khi chờ đợi kết quả cuối cùng của chúng và để các tiến trình khác chạy trong lúc nó chờ.
  • Code bất đồng bộ thông qua cơ chế trên tạo ra một hiệu ứng thực thi đồng thời. Nói cách khác, code bất đồng bộ cho ta cảm giác như nó đang concurrency.

Dưới đây là sơ đồ tổng quát. Các thuật ngữ màu trắng đại diện cho các khái niệm và các thuật ngữ màu xanh lá cây biểu thị các cách thức mà chúng được triển khai hoặc thực hiện:
Concurrency versus parallelism

Ta sẽ dừng lại ở việc so sánh giữa các mô hình lập trình đồng thời. Bài viết này tập trung vào thành phần con của async IO, cách sử dụng chúng và những API có trong nó. Để tìm hiểu thêm về sự khác biệt giữa threading, multiprocessing và async IO, hãy dừng lại ở đây và xem bài viết tổng quan về concurrency trong Python của Jim Anderson.

Giải thích về Async IO​

Async IO thoạt đầu nghe có vẻ vô lý. Làm thế nào mà một thứ gì đó có thể giúp code chạy đồng thời mà chỉ sử dụng một thread và một CPU core? Tôi (tác giả) chưa bao giờ là người giỏi ra ví dụ, vì thế tôi muốn cho các bạn xem một câu từ bài nói chuyện của Miguel Grinberg tại PyCon năm 2017, giải thích mọi thứ khá hay như sau:

Vua cờ Judit Polgár tổ chức một cuộc triển lãm cờ vua trong đó cô ấy chơi với nhiều kỳ thủ nghiệp dư. Cô ấy có hai cách tiến hành: đồng bộ và không đồng bộ.

Giả sử:
  • 24 đối thủ
  • Judit thực hiện 1 nước cờ trong 5 giây
  • Đối thủ thì mất 55 giây để thực hiện một bước
  • Một ván trung bình có 30 nước di chuyển đôi (tổng cộng là 60 lần qua lại giữa hai người)

Giải pháp đồng bộ: Judit chơi một ván mỗi lần, không bao giờ chơi hai ván cùng lúc, cho đến khi xong. Mỗi ván mất (55+5) * 30 == 1800 giây, hay 30 phút. Suy ra chơi với toàn bộ 24 người sẽ mất 24 * 30 == 720 phút, hay 12 giờ.

Giải pháp không đồng bộ: Judit chơi từ bàn này sang bàn khác, thực hiện một lần di chuyển trên từng bàn cờ. Nhân lúc đối thủ suy nghĩ để thực hiện bước đi kế tiếp thì trong thời gian đợi đó cô ấy đi qua bàn khác để đi nước tiếp theo. Để thực hiện một lần đi cờ trên cả 24 bàn Judit mất 24 * 5 == 120 giây, hay 2 phút. Suy ra toàn bộ ván cờ cho tất cả 24 bàn cờ sẽ mất 3600 giây, hay 1 giờ.

Chỉ với một Judit Polgar, người chỉ có hai tay và chỉ thực hiện một nước đi mỗi lần. Nhưng bằng cách chơi không đồng bộ đã giúp giảm thời gian của cuộc đấu xuống từ 12 giờ còn 1 giờ. Vì vậy, cooperative multitasking (hợp tác đa nhiệm) là một cách nói fancy ý chỉ về event loop (vòng lặp sự kiện) của chương trình (điều này sẽ nói sau) thực hiện giao tiếp với nhiều task cho phép từng task thay phiên nhau chạy vào những thời điểm rảnh rỗi của CPU.

Trong Async IO, khi một function bị block thì async IO sẽ cho các chương trình khác chạy trong thời gian block đó (một function block những function khác từ khi nó bắt đầu đến khi nó return kết quả - thời gian block đó thường được biết đến với thuật ngữ Độ phức tạp thuật toán).

Trên là trích từ bài dịch của mình khi còn học đại học về Async IO trong Python. Bị Viblo cướp trắng trợn nên cũng hết muốn dịch mà toàn giữ riêng cho mình. Sau khi đi làm được gần 1 năm, bị kêu đi nghĩa vụ nên nghỉ việc dọn về, về thì biết tin dự bị nên quay lại Đà Nẵng :) Đang thất nghiệp, sẵn tiện ôn bài để đi phỏng vấn thì gặp post của bác. Mong giúp ích.

Post chất lượng đó, có mấy điểm thắc mắc nhưng chắc để trao đổi sau.

Bọn viblo hay cướp bài lắm. :amazed:
Trc có bọn techtalk.vn nữa
 
Có thể nào code single thread xong chạy cùng lúc nhiều nhân bản trong 1 mây tính? Để phần thread hệ điều hành tự quản lý, tự context switch?

via theNEXTvoz for iPhone
 
Theo em thì concurrency là làm nhiều task cùng lúc(mỗi core 1 task chẳng hạn), paralel cũng là concurrency nhưng các task đều chạy để resolve 1 task to hơn. Async là các chạy dựa vào callback k theo flow khi viết(sync), nhưng thằng này k chạy cùng lúc như concurrency. Multithread cũng chỉ là 1 cách để đạt được concurrency. Theo em concurrency, paralel, asycn là concept, multi thread là mechanism

via theNEXTvoz for iPhone
 
Những thuật ngữ trên là cả cái môn hệ điều hành trên đại học, muốn giải thích là giải thích từ đâu?

Mỗi một hệ điều hành sẽ có định nghĩa về 1 process, thread khác nhau. Nhưng cơ bản thì windows, linux, macos được chuẩn hóa rồi. JVM thì không rõ nhưng có thể coi nó là một OS thôi

Khi một chương trình được nạp vào bộ nhớ để thực thi, thì chương trình đó sẽ trở thành tiến trình (process). Còn thread chính là bộ phận nhỏ nhất của tiến trình, có thể hiểu nó là một process trong process và được quản lý bởi hệ điều hành. Nói cách khác, cái mà hệ điều hành schedule là thread chứ không phải process như mấy giáo trình hệ điều hành hay nói. Việc phân bổ process / thread từ phần mềm sang phần cứng CPU cũng do hệ điều hành quản lý chứ không phải multiprogramming là ta được quyền quyết định thread nào chạy core nào của CPU
Xem tệp đính kèm 1657685
Mọi process đều có ít nhất 1 thread và nếu có nhiều hơn 1 thread thì ta gọi process đó đang chạy multithread

Synchronize, Asynchronize, Parallelism thực chất là tính chất khác nhau của multithread theo góc nhìn phần mềm. Parallelism là tính chất cho phép một process chạy nhiều công việc cùng lúc thông qua nhiều thread. Asyncronous là việc các thread chạy loạn xạ, không theo thứ tự nào cả. Việc các thread chạy loạn xạ thế này có thể sẽ gây ra lỗi race condition, do đó cần có các cơ chế synchronize bắt buộc các thread phải chạy theo thứ tự nào đấy hoặc một quy tắc chung nào đấy để dễ quản lý. Tuy nhiên, rõ ràng không phải lúc nào synchronize cũng tốt vì nó cản trở hiệu năng, cần phải xem trường hợp nào cần sync và async

Và việc quản lý các tính chất trên của thread, ta gọi chung là concurrency
Hay quá bác
 
asynchronous: 1 tay vừa chan cơm vừa nghịch điện thoại
parallel: tay trái ăn cơm, tay phải nghịch điện thoại
concurrency: không quan trọng 1 tay hay nhiều tay, miễn là xử lý được nhiều việc cùng 1 lúc
 
nhiều người hay hiểu async theo kiểu này nhỉ, mình thấy lúc nào cũng là chạy tuần tự thôi, chỉ là cái callback trong hàm async đó ko được invoke ngay trực tiếp, hay dân gian còn gọi là đẩy vào event loop để xử lý, sau khi xử lý ms đẩy vào callback queue để lấy ra thực thi
này là định nghĩa event loop bên node, còn bên java, c#, go lang bọn nó có hoạt động giống ntn k thím
 
Mình hiểu đại khái thế này với context Java:
Đầu tiên program sẽ chạy trên 1 thread (vd public static void main() method).

Asynchronous: mình tạo và push message lên Message Queue, để service khác consume. Thread hiện tại vẫn chạy bình thường và không bị block.
thím cho e hỏi java cũng có cơ chế tự chơi async đc k, kiểu đưa vào thread pool, chứ ý thím đang nói ở đây là nhờ thằng khác xử lí (msg queue)
 
Concurrency, Parallel, Asynchronous và Multithreading là các khái niệm liên quan đến xử lý đa luồng trong lập trình, tuy nhiên chúng có những khác biệt như sau:

  1. Concurrency (đồng thời): Từ "concurrency" đề cập đến việc xử lý nhiều tác vụ đồng thời. Các tác vụ này có thể được xử lý theo một thứ tự bất kỳ và chúng có thể được chia sẻ trên nhiều luồng khác nhau. Concurrency có thể được đạt được trong một luồng duy nhất, một quá trình hoặc qua nhiều luồng.
  2. Parallelism (song song): Parallelism đề cập đến việc xử lý các tác vụ đồng thời trên nhiều luồng khác nhau, nhằm đạt được hiệu suất cao hơn. Parallelism có thể được đạt được trên nhiều luồng, nhiều quá trình hoặc nhiều máy tính khác nhau.
  3. Asynchronous (bất đồng bộ): Asynchronous là việc xử lý các tác vụ mà không cần chờ đợi kết quả trả về. Thay vào đó, chương trình có thể tiếp tục thực thi các tác vụ khác trong khi tác vụ ban đầu đang chạy ở nền.
  4. Multithreading (đa luồng): Multithreading là việc thực thi nhiều luồng đồng thời trong một chương trình, nhằm đạt được hiệu suất cao hơn. Mỗi luồng thực hiện các tác vụ độc lập với nhau, nhưng có thể truy cập chung vào các biến và tài nguyên của chương trình.
Tóm lại, Concurrency và Parallelism đều liên quan đến việc xử lý đồng thời, nhưng Parallelism tập trung vào việc tăng hiệu suất bằng cách sử dụng nhiều luồng, trong khi Concurrency tập trung vào việc chia sẻ tài nguyên. Asynchronous là việc xử lý các tác vụ mà không cần chờ đợi kết quả, trong khi Multithreading là việc thực thi nhiều luồng đồng thời trong một chương trình.
 
thím cho e hỏi java cũng có cơ chế tự chơi async đc k, kiểu đưa vào thread pool, chứ ý thím đang nói ở đây là nhờ thằng khác xử lí (msg queue)
Được chứ. Nhưng Async ko nhất thiết phải là concurrency hay parralel. Mình lấy ví dụ thế cho dễ hiểu
 
Được chứ. Nhưng Async ko nhất thiết phải là concurrency hay parralel. Mình lấy ví dụ thế cho dễ hiểu
Thì mình hiểu là k cần xử lí cùng lúc, nhưng ý mình hỏi ở đây là trong TH server đang phải handle nhiều rq at peak time, thì phải chơi song song rồi và mình đang muốn hỏi cơ chế thuần để làm việc này của java. Bạn kia là nhờ th broker làm thì k phải pure rồi
 
Thì mình hiểu là k cần xử lí cùng lúc, nhưng ý mình hỏi ở đây là trong TH server đang phải handle nhiều rq at peak time, thì phải chơi song song rồi và mình đang muốn hỏi cơ chế thuần để làm việc này của java. Bạn kia là nhờ th broker làm thì k phải pure rồi
Ví dụ nếu cần fetch từ database hay REST call mà không cần đợi, hoặc giải quyết phần JPA Level 1 cache, thì mình vẫn dùng CompletableFuture với ExecutorService fixed thread pool.
 
Ví dụ nếu cần fetch từ database hay REST call mà không cần đợi, hoặc giải quyết phần JPA Level 1 cache, thì mình vẫn dùng CompletableFuture với ExecutorService fixed thread pool.
tại sao khi fetch data bác lại xài 2 thằng này v ạ, bác cho e hỏi ít ưu nhược điểm được không. ví dụ có 2 request 1 get 1 update, thì phần này handle ntn hay cần config phía DB ko nhỉ ?
 

Thống kê chủ đề

Ngày tạo
o0alvin0o,
Người trả lời cuối
tuong_tuong_1,
Trả lời
163
Lượt xem
29.741
Quay lại
Lên đầu trang