Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is Node.js called single threaded when it maintains threads in thread pool?

Node.js maintains an event loop but then it also has by default four threads for the complicated requests. How this is single threaded when there are more threads available in the thread pool?

Also, the threads assigned by the event loop for the complicated task are the dedicated threads then how it's different from other multithreading concepts?

like image 736
rahul kumar Avatar asked Jan 13 '18 15:01

rahul kumar


1 Answers

I will tell it in a clear and simple way and clear the confusion :

Node Event Loop is SINGLE-THREADED But THE Other processes are not.

The confusion came from c++, which Node uses underline ( NodeJs is about 30% js + 70% c++ ).So, By default, The JS part of NodeJs is single-threaded BUT it uses a thread pool of c++. So, We have a single thread JS which is the event loop of NodeJs + 4 threads of c++ if needed for asynchronous I/O operations.

It is also important to know that The event loop is like a traffic organizer, Every request go through the loop ( which is single-thread ) then the loop organizes them to the pool threads if I/O processes are needed, so if you have a high computational app that does like heavy lifting image-processing, video-editing, audio-processing or 3d-graphics ..etc, which is not needed for most apps,So NodeJs will be a bottleneck for that high load computational app and the traffic organizer will be unhappy. While NodeJS shine for I/O bound apps ( most apps ) Like apps dealing with databases and filesystem.

Again: By default, NodeJs uses a 4 thread pool (PLUS one thread for the event loop itself ). so by default (total of 5) because of the underlying c++ system.

As a general idea, The CPU could contain one or more cores, it depends on your server(money).

Each core could have threads. Watch your activity Monitor discover how many threads you are using.

Each process has multiple threads.

The multi-threading of Node is due to that node depends on V8 and libuv ( C Library ).

So Long story short:-

Node is single-threaded for the event loop itself but there are many operations that are done outside the event Loop, Like crypto and file system (fs ). if you have two calls for crypto then each of them will reach each THREAD ( imagine 3 calls to crypto and 1 for fs, These calls will be distributed one for each thread from the 4 thread pool )

Finally: It is very easy to increase the default number of threads of the C-Library libuv thread pool which is 4 by default by changing the value of process.env.uv_threadpool_size. and also you could use clustering ( PM2 recommended ) to like clone the event-loop, like have multiple event-loops in case the single-threaded one is not enough for your high load app.

So nobody illustrates that thread pool is a c++ thing that’s nodeJs control mostly not the developer, which still asking How it’s single-thread while having a thread-pool !!

Hope that simplifies that advanced topic.

like image 95
mercury Avatar answered Oct 19 '22 02:10

mercury