Thắc Mắc - Hỏi Về Async Vs Thread - VOZ
Có thể bạn quan tâm
- Forums New posts
- Latests Featured content New posts New profile posts Latest activity
- New posts
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
- Forums
- Học tập & Sự nghiệp
- Lập trình / CNTT
- Thread starter Thread starter karu88
- Start date Start date May 13, 2020
- 1
- 2
- 3
Go to page
Go Next Lastkaru88
Senior Member
để chạy đa luồng thì nên dùng cái nào vậy mấy bác. Ưu nhược điểm của mỗi cái là thế nào? Bác nào rảnh phân tích giúp em tí được không?qkhanhpro
Đã tốn tiền
Nói ra thì dông dài nhưng khi cần hỏi câu này thì lời khuyên pratical nhất mình có thể cho là dùng async đi (Vì không hiểu rõ / không nghiên cứu kỹ / không có người guide thì code multi threading dễ ra đống rác lắm) Async không có nghĩa là đa luồng. Nhưng ( by framework implementation ) async "thường" tận dụng đa luồng khi có thểKuroOokami
Đã tốn tiền
Async là concurrent, Thread là parallel, 2 cái đó là 2 cái khái niệm khác nhau mà
Chạy đa luồng thì multi thread thôi, còn chạy bất đồng bộ thì async TTN_vOz
Senior Member
Bạn đang hỏi sai câu hỏi. Async là khái niệm thực thi một operation bất đồng bộ. Thread nằm ở tầng low level để thực thi việc bất đồng bộ đó. Tuy nhiên các ngôn ngữ sẽ cung cấp cho bạn cách thức để thực thi Async mà ko cần phải quan tâm quản lý Thread. Ví dụ Java có Futurekaru88
Senior Member
Cảm ơn mấy thìm. Đang đọc mấy cái tiếng anh cũng hiểu lơ mơ rồi. Cái mục tiêu của em là làm nhiều luồng thực hiện, giống như IDM có 16 luồng download 1 lúc ấy. em đọc thì thấy có cái thì họ dùng thread, gọi 16 thread dể chạy function. Có cái họ lại dùng async/await. Mới học nên chưa rõ lắm. trước giờ em toàn xài thread. Muốn cho chạy nhanh thì cứ kêu nhiều thread ra cho nó chạy. Mà dạo này đọc code mẫu thấy đa số xài async nên mới tìm hiểu thêm. Vậy là thread là low-level để chạy đa luồng song song. còn async là lập trình bất đồng bộ, cấp cao hơn thread. Nó quản lý thread để đơn giản hóa việc đa luồng cho mình hả mấy thím. Với cả đọc thấy chạy thread cần phải chú ý tới thread-safe. Còn Async thì không phải lo. Chắc từ nay em xài async hết.karu88
Senior Member
tuananh_304 said: Thím phải xác định được task vụ của thím là gì. CPU bound hay IO bound. Trước tiên async đại khái là trong khi bạn đang chờ kết quả từ IO, thì cpu có thể tạm thời tạm dừng tác vụ đó đi làm cái khác. Nếu mà tác vụ là CPU bound (xử lý ảnh, xoay crop) thì async k có ý nghĩa lắm, vì nó vẫn chiếm dụng tài nguyên CPU, main thread vẫn có thể bị blocked. Còn nếu là IO bound như http request, disk io, (trong khi bạn đang chờ kết quả thì cpu có thể đi làm việc khác) thì bạn nên sử dụng async. À như bác trên có nói, thì Java nó cho bác tạo 1 Thread-pool nằm tách biệt với main-thread. Bác summit cái job vào chạy trong cái thread-pool ấy thì nó trả về kết quả trong Future, Lúc ý main-thread k bị block mà vẫn chạy dc những tác vụ khác. Còn tụi singlethread như Nodejs, Python thì async mà sử dụng CPU bound thì không có ý nghĩa j hết. Click to expand...Chỗ này em đọc thấy họ nhóm async với thread vào chung một nhóm cho I/O bound. Còn CPU bound thì phải xài multiprocessing. Có đúng không thím
karu88
Senior Member
tuananh_304 said: Thím phải xác định được task vụ của thím là gì. CPU bound hay IO bound. Trước tiên async đại khái là trong khi bạn đang chờ kết quả từ IO, thì cpu có thể tạm thời tạm dừng tác vụ đó đi làm cái khác. Nếu mà tác vụ là CPU bound (xử lý ảnh, xoay crop) thì async k có ý nghĩa lắm, vì nó vẫn chiếm dụng tài nguyên CPU, main thread vẫn có thể bị blocked. Còn nếu là IO bound như http request, disk io, (trong khi bạn đang chờ kết quả thì cpu có thể đi làm việc khác) thì bạn nên sử dụng async. À như bác trên có nói, thì Java nó cho bác tạo 1 Thread-pool nằm tách biệt với main-thread. Bác summit cái job vào chạy trong cái thread-pool ấy thì nó trả về kết quả trong Future, Lúc ý main-thread k bị block mà vẫn chạy dc những tác vụ khác. Còn tụi singlethread như Nodejs, Python thì async mà sử dụng CPU bound thì không có ý nghĩa j hết. Click to expand...Chỗ này em đọc thấy họ nhóm async với thread vào chung một nhóm cho I/O bound. Còn CPU bound thì phải xài multiprocessing. Có đúng không thím
ez-aqua
Senior Member
Lâu rồi mình không đụng vào C# code, nhưng mình có thể giải thích Async và Parallel là như thế này. Với Async, vd như bạn làm bánh mì, sau khi bạn nặn bánh xong rồi bỏ vào lò nướng, thay vì bạn đứng im chờ cho đến khi nào bánh mì nó nướng xong rồi mới đi chuẩn bị nhân bánh, thì bạn cứ thả cho lò nó hoạt động, còn mình thì cứ tiếp tục chuẩn bị nhân bánh. Khi bạn nghe thấy tiếng ting báo bánh đã nướng xong, và vụ nhân bánh bạn cũng chuẩn bị xong, thì bạn sẽ lấy bánh ra khỏi lò, nhét nhân vào bánh, rồi bỏ bánh vào miệng. Trông thì có vẻ bạn đang làm 2 việc cùng 1 lúc là vừa làm bánh vừa làm nhân, nhưng thực tế bạn ko làm song song, chỉ là ko để thời gian chết thôi. Còn nếu bạn thả task xuống threadpool Task.Run() thì cái này nó giống như bạn 1 tay vẽ hình tròn, 1 tay vẽ hình vuông vậy. Nếu bạn có 2 bộ não (CPU), thì bạn có thể dùng não 1 điều khiển tay trái vẽ hình tròn, dùng não 2 điều khiển tay phải vẽ hình vuông. Lúc này bạn mới thực sự là làm 2 việc cùng 1 lúc. Khi Async kết hợp parallel: Ví dụ bạn có 3 bộ não: Não 1 nhiệm vụ nghe câu hỏi và viết câu trả lời ra giấy, câu hỏi vào liên tục, não 2 và não 3 làm nhiệm vụ giải toán. Não (CPU) 1 nghe câu hỏi từ bên ngoài, giao việc (tasks) cho não 2 và não 3 giải. Thay vì nó đứng im, nhìn chằm chằm chờ cho đến khi não 2 và 3 giải xong (block) rồi mang đáp án do não 2 và não 3 giải ra viết vào giấy rồi mới nghe câu hỏi mới, thì nó giao việc, rồi trở lại trạng thái sẵn sàng nghe câu hỏi mới (non-blocking), sẽ nghe và note lại câu hỏi mới, nhưng cũng đang trong trạng thái chờ câu trả lời từ não 2 và 3 (await). Nếu nó không đang bận nghe câu hỏi mới hoặc bận làm việc gì đó khác và não 2 và 3 đã giải xong bài thì nó sẽ mang kết quả từ 2 não kia về rồi viết vào giấy. Những việc của não 1 làm là async. Não 2 não 3 giải các bài toán khác nhau, trong cùng một lúc. Có bài toán khó, não phải giải lâu hơn thì trả kết quả nhanh hơn. Có bài dễ hơn thì trả kết quả nhanh hơn.... Bọn não 2 và 3 đang làm việc parallel với nhau. Lâu rồi mình ko đụng vào code C# nên cũng ko biết có để sai sót gì hay không, nhưng bạn có thể đọc thêm ở đây. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/sirhung1993
Người qua đường
Async/ Sync là hiện tượng mình thấy trong run-time:- Nếu Async thì mình sẽ thấy thứ tự chạy ko xác định trước (ví dụ Javascript với callback hoặc promise ) hoặc là main-thread ko bị block tại 1 câu lệnh mà chạy tới những câu lệnh sau đó.
- Sync là hiện tượng code chạy tuần tự từ trên xuống dưới, cho dù là đợi network mất 1s nó vẫn phải block đó rồi mới chạy tới câu lệnh tiếp theo.
zulu
Member
ez-aqua said: Lâu rồi mình không đụng vào C# code, nhưng mình có thể giải thích Async và Parallel là như thế này. Với Async, vd như bạn làm bánh mì, sau khi bạn nặn bánh xong rồi bỏ vào lò nướng, thay vì bạn đứng im chờ cho đến khi nào bánh mì nó nướng xong rồi mới đi chuẩn bị nhân bánh, thì bạn cứ thả cho lò nó hoạt động, còn mình thì cứ tiếp tục chuẩn bị nhân bánh. Khi bạn nghe thấy tiếng ting báo bánh đã nướng xong, và vụ nhân bánh bạn cũng chuẩn bị xong, thì bạn sẽ lấy bánh ra khỏi lò, nhét nhân vào bánh, rồi bỏ bánh vào miệng. Trông thì có vẻ bạn đang làm 2 việc cùng 1 lúc là vừa làm bánh vừa làm nhân, nhưng thực tế bạn ko làm song song, chỉ là ko để thời gian chết thôi. Còn nếu bạn thả task xuống threadpool Task.Run() thì cái này nó giống như bạn 1 tay vẽ hình tròn, 1 tay vẽ hình vuông vậy. Nếu bạn có 2 bộ não (CPU), thì bạn có thể dùng não 1 điều khiển tay trái vẽ hình tròn, dùng não 2 điều khiển tay phải vẽ hình vuông. Lúc này bạn mới thực sự là làm 2 việc cùng 1 lúc. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/ Click to expand...Cơ bản thì bác cũng đúng rồi, mình chỉ nói thêm 1 chút: Về bản chất sử dụng Thread hay ThreadPool có Parallel hay không phụ thuộc vào kiến trúc CPU. Nếu CPU đơn luồng thì tất cả chỉ là giả Parallel. Thêm nữa, C# thì async phát huy tốt vs các tác vụ IO bound thôi, chứ CPU bound thì cũng ko khác biệt j về hiệu năng mang lại. Z
zhukov
Member
Hài ...có đôi lời. Async khác thread. Vs các ngôn ngữ hiện đại cái này hay hơn thread kiểu cổ điển của os cung cấp. Có rất nhiều bác nghĩ thread là Parallel. Thực tế hoàn toàn sai..gần hết. Thread nằm trong tiến trình process. Os khi run có quá nhiều process làm gì có chuyện song song được. Thực sự nếu một process được gắn vào một core cpu thì mới có vụ song song thực. Kiểu như OpenMP or MPI. Haizz chi phí của os cho việc context thread switch là lớn hơn nhiều so với mấy vụ Async or coroutine ( bản chất gần như là một). Thực hiện các context switch ở ko gian người dùng. Chi phí rẻ hơn nhiều ... Từ lâu đã ko mấy khi dùng mấy cái thread. Nhất cho mấy vụ I/O liên quan tới network. Đôi lời xàm xàm ý kiến cá nhân. Ddreamnight
Junior Member
Câu hỏi có vẻ gây hiểu lầm vì bản chất 2 cái keywords trên khác nhau về concept tí: - Thread: là một luồng xử lý được sinh ra bởi scheduler (với nhiều programing language thì nó là ThreadPool) của process của CPU. - Async: Ý chỉ asynchronous bất đồng bộ, nó cho phép các threads hoạt động độc lập và chỉ "wait" khi cần một kết quả từ thread khác. Gọi nó là non-blocking cũng chẳng sai nhưng block cái gì mới là đáng nói. Quay lại câu hỏi "Lập trình đa luồng" thì sài cái nào? Câu trả lời là chẳng có cái nào the best, phải tùy vào từng use cases. Đại đa số dev đều biết 2 kiểu là parallel và async, mình chi tiết 1 tí cho bạn dễ hiểu: - Parallel hay async programing đều là dạng lập lịch scheduler trong ThreadPool, cho phép quản lý CPU bound để thực thi threads. - Parallel: là dạng lập lịch cho nhiều thread mà trong đó không quan tâm điểm bắt đầu thực thi mà chỉ quan tâm đến thời điểm mà mọi threads đã được xử lý xong. Trong quá trình xử lý threads, số lượng threads được thực thi cùng lúc sẽ được xác định bởi N phải <= số CPU M (M phải > 1). - Async: là dạng lập lịch cho nhiều thread mà trong đó các threads hoạt động độc lập, chỉ "wait" tại một thời điểm đã được xác định nào đó. Đại đa số đều ưa dùng cái này vì nó giúp code dễ control hơn, vì bạn đã xác định chỗ "wait" thay vì phải "wait" tất cả như Parallel. Tuy nhiên bạn phải hiểu rõ một vấn đề : Lập trình đa luồng ko đồng nghĩa bạn lập trình đa CPU, việc sử dụng tốt đa CPU lại phụ thuộc vào OS và low-level của programming language của bạn.ThuyMy
Senior Member
dreamnight said: Câu hỏi có vẻ gây hiểu lầm vì bản chất 2 cái keywords trên khác nhau về concept tí: ... Click to expand...Kiến thức kiểu gì hỏng bung bét thế này
D dreamnight
Junior Member
ThuyMy said: Kiến thức kiểu gì hỏng bung bét thế nàyHỏng chỗ nào xin bạn chỉ giúpClick to expand...
? Nguồn của mình: https://docs.microsoft.com/en-us/dotnet/standard/threading/threads-and-threading https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/ Bạn chủ topic dùng từ async vs thread nhé, và 2 cái đó concept khác nhau. Nipin
Member
đọc thread thấy nản vkl, trước giờ chỉ thấy parallel vs concurrent, sync vs async thôi lần đầu mới thấy đi so parallel với async. tiếp đó thì loạn khái niệm, cơ mà cái này thông cảm, thằng crystal-lang phải viết hẳn một page dài giải thích cái này: https://crystal-lang.org/reference/guides/concurrency.html cơ mà cái quan trọng nhất là các bạn đíu phân biệt được là mỗi một hệ thống, một ngôn ngữ hoặc thậm chí là một thư viện thì nó sẽ có implemation khác nhau về thread (native thread vs green thread... m:n thread vs 1:1 thread...), có thằng lại dùng coroutine, fiber, actor model các kiểu, thành ra khi giải thích một chuyện thì phải nói rõ ra là mình đang dùng ngôn ngữ nào (nếu thư viện đặc biệt thì cũng cần nói luôn cả thư viện), chứ cứ giải thích mù mờ, cái hiểu cái không thì chỉ tổ làm người khác hiểu sai :/karu88
Senior Member
Nipin said: đọc thread thấy nản vkl, trước giờ chỉ thấy parallel vs concurrent, sync vs async thôi lần đầu mới thấy đi so parallel với async. tiếp đó thì loạn khái niệm, cơ mà cái này thông cảm, thằng crystal-lang phải viết hẳn một page dài giải thích cái này: https://crystal-lang.org/reference/guides/concurrency.html cơ mà cái quan trọng nhất là các bạn đíu phân biệt được là mỗi một hệ thống, một ngôn ngữ hoặc thậm chí là một thư viện thì nó sẽ có implemation khác nhau về thread (native thread vs green thread... m:n thread vs 1:1 thread...), có thằng lại dùng coroutine, fiber, actor model các kiểu, thành ra khi giải thích một chuyện thì phải nói rõ ra là mình đang dùng ngôn ngữ nào (nếu thư viện đặc biệt thì cũng cần nói luôn cả thư viện), chứ cứ giải thích mù mờ, cái hiểu cái không thì chỉ tổ làm người khác hiểu sai :/ Click to expand...Em đang học C# với cả python thím ơi. Càng xem càng rối vụ này D
dreamnight
Junior Member
Nipin said: đọc thread thấy nản vkl, trước giờ chỉ thấy parallel vs concurrent, sync vs async thôi lần đầu mới thấy đi so parallel với async. tiếp đó thì loạn khái niệm, cơ mà cái này thông cảm, thằng crystal-lang phải viết hẳn một page dài giải thích cái này: https://crystal-lang.org/reference/guides/concurrency.html cơ mà cái quan trọng nhất là các bạn đíu phân biệt được là mỗi một hệ thống, một ngôn ngữ hoặc thậm chí là một thư viện thì nó sẽ có implemation khác nhau về thread (native thread vs green thread... m:n thread vs 1:1 thread...), có thằng lại dùng coroutine, fiber, actor model các kiểu, thành ra khi giải thích một chuyện thì phải nói rõ ra là mình đang dùng ngôn ngữ nào (nếu thư viện đặc biệt thì cũng cần nói luôn cả thư viện), chứ cứ giải thích mù mờ, cái hiểu cái không thì chỉ tổ làm người khác hiểu sai :/ Click to expand...Mình thì lại chẳng thấy nó liên quan gì câu chuyện ngôn ngữ ở đây cả. Vì đơn giản đây là đang đi về basic theory hơn, ai ai cũng phải biết. Đồng ý với bạn một phần là nhiều ngôn ngữ viết ra nhiều định nghĩa riêng và mỗi người có thể hiểu theo ngôn ngữ của họ. Ngoài ra có thể bạn cũng đang hiểu nhầm phần post của mình, mình nói đến "Lập trình đa luồng" hay "Multiple-thread programming", và khi nói đến vấn đề này thì sẽ có 2 dạng programming là Parallel và Async, cả 2 đều là lập trình xử lý đa luồng (hoặc theo ý bạn parallel ko phải multiple-thread programming?), nếu mình sai thì xin bạn chỉ rõ dùm còn theo Microsoft docs là ở đây: https://docs.microsoft.com/en-us/dotnet/standard/async -> Lập trình bất đồng bộ https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/ -> Lập trình song song Page của bạn có thể là nguồn tin cậy tuy nhiên để định nghĩa về Multiple-thread programming thì mình vẫn prefer Microsoft Docs hoặc Google Docs (nếu có mình ko thuộc trường phái Java). Đồng ý mình làm việc với Microsoft nhiều năm nên cũng ko dám nói page của bạn sai hoặc kiến thức bạn đưa ra sai. Chỉ có điều 2 cái này là basic theory của computer science mà ai học ĐH đều có biết qua (cái này mình chỉ nhớ là có vì đã nhiều năm rồi). D
dreamnight
Junior Member
karu88 said: Em đang học C# với cả python thím ơi. Càng xem càng rối vụ này Click to expand...C# thì theo 2 pages của mình đính kèm ở trên nhé, nếu tin vào M$ thì đọc ko thì bạn có thể search qua các trang uy tín của Python
namhoangnguyen8
Senior Member
Async, await thì chủ yếu là làm code bất đồng bộ của bạn dễ đọc hơn, khi đọc thì có thể đọc code giống như đồng bộ. Bác chọn cái nào cũng đc, miễn là bác đọc dễ hiểu là được. Mình thì thấy thích async với await hơn.Nipin
Member
dreamnight said: Mình thì lại chẳng thấy nó liên quan gì câu chuyện ngôn ngữ ở đây cả. Vì đơn giản đây là đang đi về basic theory hơn, ai ai cũng phải biết. Đồng ý với bạn một phần là nhiều ngôn ngữ viết ra nhiều định nghĩa riêng và mỗi người có thể hiểu theo ngôn ngữ của họ. Ngoài ra có thể bạn cũng đang hiểu nhầm phần post của mình, mình nói đến "Lập trình đa luồng" hay "Multiple-thread programming", và khi nói đến vấn đề này thì sẽ có 2 dạng programming là Parallel và Async, cả 2 đều là lập trình xử lý đa luồng (hoặc theo ý bạn parallel ko phải multiple-thread programming?), nếu mình sai thì xin bạn chỉ rõ dùm còn theo Microsoft docs là ở đây: https://docs.microsoft.com/en-us/dotnet/standard/async -> Lập trình bất đồng bộ https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/ -> Lập trình song song Page của bạn có thể là nguồn tin cậy tuy nhiên để định nghĩa về Multiple-thread programming thì mình vẫn prefer Microsoft Docs hoặc Google Docs (nếu có mình ko thuộc trường phái Java). Đồng ý mình làm việc với Microsoft nhiều năm nên cũng ko dám nói page của bạn sai hoặc kiến thức bạn đưa ra sai. Chỉ có điều 2 cái này là basic theory của computer science mà ai học ĐH đều có biết qua (cái này mình chỉ nhớ là có vì đã nhiều năm rồi). Click to expand...tôi đéo bảo là m$ sai, tôi chỉ bảo là bạn đọc hiểu như l`n. bạn thử tìm cho tôi cái topic nào nói async và parallel là hai khái niệm tương đương chỉ 2 dạng khác nhau về MT xem nào?
- 1
- 2
- 3
Go to page
Go Next Last You must log in or register to reply here.Similar threads
- loctran145
- Dec 16, 2025
- Lập trình / CNTT
- The Gunners 2003-2004
- Dec 17, 2025
- Đồ điện tử & Thiết bị gia dụng
- Zeb@12
- Nov 26, 2025
- Lập trình / CNTT
- quangpro1201
- Dec 16, 2025
- Lập trình / CNTT
- youandme15994
- Saturday at 10:11 AM
- Phim / Nhạc / Sách
Thread statistics
Created karu88, May 13, 2020 Last reply from xindungbantoi2, Jun 10, 2020 Replies 58 Views 15,434Share this page
Facebook X (Twitter) LinkedIn Reddit Pinterest WhatsApp Share Link- Forums
- Học tập & Sự nghiệp
- Lập trình / CNTT
Từ khóa » đa Luồng Và Bất đồng Bộ
-
Khác Nhau Giữa Lập Trình Bất đồng Bộ Và đa Luồng Trong C#?
-
Sự Khác Biệt Giữa Lập Trình Không đồng Bộ Và đa Luồng Là Gì?
-
Lập Trình đa Luồng: Các Cơ Chế đồng Bộ Trong Python - Viblo
-
Lập Trình Bất đồng Bộ Trong C# - Viblo
-
Lập Trình Bất đồng Bộ Asynchronou C# C Sharp Với ...
-
Thread Và Tasks Trong C# Sử Dụng Như Thế Nào? - CodeLearn
-
Đồng Bộ Và Bất Đồng Bộ Trong Java Là Gì? - CodeLearn
-
Thread Và Tasks Trong C# Sử Dụng Như Thế Nào? - Chickgolden
-
Lập Trình Bất đồng Bộ (asynchronous Programming) | Tự Học ICT
-
Xử Lý Bất đồng Bộ Trong JavaScript - TMA Solutions
-
Đồng Bộ Và Bất đồng Bộ Trong Java - Kipalog
-
Cách Thực Hiện đa Luồng - Multithreading Với Node.js - Techmaster
-
[PDF] CHƯƠNG 3: QUẢN LÝ TIẾN TRÌNH VÀ LUỒNG - SOICT
-
Nguyên Tắc Của đồng Bộ Và Bất đồng Bộ Trong Javascript - CodeGym