Concurrency vs Multi-threading vs Asynchronous Programming : Explained

Recently, I was speaking in an event and I asked a question about Asynchronous programming to the audience, I found that many were confused between multi-threading and asynchronous programming and for few, it was same. So, I thought of explaining these terms including an additional term Concurrency. Here, there are two completely different concepts involved, First – Synchronous and Asynchronous programming model and second – Single threaded and multi-threaded environments. Each programming model (Synchronous and Asynchronous) can run in single threaded and multi-threaded environment. Let’s discuss each in detail.

Synchronous Programming model – In this programming model, A thread is assigned to one task and starts working on it. Once the task completes then it is available for the next task. In this model, it cannot leave the executing task in mid to take up another task. Let’s discuss how this model works in single and multi-threaded environments.

Single Threaded – If we have couple of tasks to be worked on and the current system provides just a single thread, then tasks are assigned to the thread one by one. It can be pictorially depicted as

singlethreadedHere we can see that we have a thread (Thread 1 ) and four tasks to be completed. Thread starts workingon the tasks one by one and completes all. (The order in which tasks will be taken up, does not affect the execution, we can have different algorithm which can define the priorities of tasks)

Multi-Threaded – In this environment, we used to have multiple threads which can take up these tasks and start working on that. It means we have a pool of threads (new threads can also be created based on the requirement and available resources) and bunch of tasks. So these thread can work on these as

multithreadedHere we can see that we have four threads and same number of tasks to complete. So each thread takes up one task and completes that. This is an ideal scenario but in normal cases, we used to have more number of tasks than the number of available threads. So, whichever thread gets free, takes up another task. As already mentioned that spawning new thread is not an option each time because it requires system resources like CPU, memory.

Now, Let’s talk about Asynchronous model and how does it behave in single and multi-threaded environment.

Asynchronous Programming Model – In contrary to Synchronous programming model, here a thread once start executing a task it can hold it in mid, save the current state and start executing another task.

async-singleHere we can see that a single thread is responsible to complete all the tasks and tasks are interleaved to each other.

If our system is capable of having multiple threads then all the threads can work in asynchronous model as well

Async-mutlithreadedHere we can see that same task say T4, T5, T6.. are handled by multiple thread. This is the beauty of this scenario. As you can see that T4 was started first in Thread 1 and completed by Thread 2. Similarly, T6 is completed by Thread 2, Thread 3 and Thread 4. It shows the maximum utilization of the threads.

So till now we have discussed four scenarios –

  1. Synchronous Single Threaded
  2. Synchronous Multi-Threaded
  3. Asynchronous Single Threaded
  4. Asynchronous Multi-Threaded

Let’s discuss one more term – Concurrency.

Concurrency

In simple terms, concurrency means processing multiple requests at a time. As we have discussed two scenarios where multiple requests were getting processed, Multi-threaded programming and asynchronous model (single and multi-threaded both). In case of asynchronous model whether single or multi-threaded, multiple tasks are in progress at a time, some are in hold state and some are getting executed. There are many flavors of it but that is beyond the scope of this post.

As discussed earlier, the new age is of asynchronous programming. Why is it so important?

Benefits of Asynchronous Programming

There are two things which are very important for any application – Usability and Performance. Usability because say a user clicks on a button to save some data. This requires multiple smaller tasks like reading and populating data in internal object, establishing connection with SQL and saving it there etc. As SQL runs on another machine in network and runs under different process, it could be time consuming and may take bit longer. So, if the application runs on a single thread then the screen will be in hanged state till all the tasks completes which is a very bad user experience. That’s why nowadays many applications and new frameworks completely rely on asynchronous model.

Performance of an application is also very important. It has been seen that while executing a request, around 70-80% of the time gets wasted while waiting for the dependent tasks. So, it can be maximum utilized by asynchronous programming where once the task is passed to another process (say SQL), current thread saves the state and available to take another task. When the SQL task completes any thread which is free, can take it up further.

Asynchrony in ASP.NET

Async in ASP.NET can be a major boost in the throughput of your application. Let’s see, how IIS processes a request.

CLRWhen a request is received by IIS, it takes a thread from CLR thread pool (IIS does not own any thread-pool itself instead uses CLR thread pool) and assigns to it which further processes the request. As number of threads are limited and new ones can be created at a certain limit then if the thread wastes most of the time in waiting then it’s going to hit hard to your application’s overall performance. But if you write asynchronous code (which now become very easy and can be written almost similar to synchronous using the new keywords async/await in C#) then it will be way faster and throughput of your server will increase significantly because instead of waiting something to complete, it will be available to thread pool to take the new requests. If the application has a lot of dependency and long running process then for those application, async programming will be not less than a boon.

So now we have understood the difference in multi-threading, asynchronous programming and the kind of benefit we can get using asynchronous programming model.

Cheers
Brij

22 thoughts on “Concurrency vs Multi-threading vs Asynchronous Programming : Explained

  1. I really liked this article. I was also confused in synchronous and asynchronous approach. Thank you for making it clear in a very easy way. I request if you can post some examples of await or asynchronous model.

  2. @Brij, Can you please clarify this to me. Lets assume I have

    Asynchronous Single Threaded(Thread1) Program with 2 tasks(task1- long running task & task2)
    Async – means Thread1 can take up task2 wihtout the task1 being completed.
    Await – means Thread1 has to wait for task1 to be completed before processing task2.–so what is the use of using aysnc if the Thread1 waits for the task1 to be completed ? It again becomes a syncrhonous propgramming right ? Correct me where I am wrong.

    Thanks.

  3. Pingback: Asynchronous programming with async and await : explained | Code Wala

  4. Thanks for your nice article. I have been confused about Multi-threading vs Asynchronous for a time.

    I request if I can translate this article to Chinese as my first translation as I wanna my friends can also read it. I’ll keep the URL of your origin text.

    Thanks again

  5. Pingback: Kiến thức cần nắm – phuoclq

  6. hey Brij, thanks for explaining these concepts … I have sen many people who starts learning the multi-threading but don’t have this base knowledge. You have explained very well. Once again thanks fro sharing your knowledge. This article is very helpful.

  7. Pingback: Concurrency vs Multi-threading vs Asynchronous Programming | amzdmt's Blog

  8. If we have one cpu core to execute, then single threading and multiple threading doesn’t make a difference in execution time ? And More over multi threading will be solwer since context switching?

    • You are right if it has just one processor. But nowadays most of the machines are multi core. Intel’s latest CPU’s have more logical processors like HT – Hyper Threading which can run 2 threads on a single core.

  9. Thank you so much for this article! I was learning multithread and confused a lot in the recent two days by reading a bunch of articles, yours is definitely straightforward and very helpful! Thanks!

Leave a comment