jaume
jaume

Reputation: 635

Why "worker_threads" when we have default worker pool?

I see clear the cluster method as it deploys different whole processes. And I guess the professional programmers made "worker_threads" library for some good reason... but I still need to clear this point for my understanding:

In a normal single threaded process the event loop thread has the aid of the default worker pool to unload its heavy I/O tasks, so the main thread is not blocked.

At the same time, user defined "worker threads" will be used for the same reason with their own event loops and NodeJS instances.

What's the point of spawning those event loop and Nodejs instances when they are not the bottle neck as the libuv is intended to manage to spawn the workers.

Is this meaning that the default worker pool may not be enough? I mean just a quantity matter or concept?

Upvotes: 7

Views: 3169

Answers (1)

Sandeep Patel
Sandeep Patel

Reputation: 5148

There are two types of operation(call) in Nodejs blocking and non-blocking

non-blocking

Nodejs use Libuv for IO non-blocking operation. Network, file, and DNS IO operations run asynchronously by Libuv. Nodejs use the following scheme:

Asynchronous system APIs are used by Node.js whenever possible, but where they do not exist, Libuv's thread pool is used to create asynchronous node APIs based on synchronous system APIs. Node.js APIs that use the thread pool are:

  • all fs APIs, other than the file watcher APIs and those that are:

  • explicitly synchronous asynchronous crypto APIs such as crypto.pbkdf2(), crypto.scrypt(), crypto.randomBytes(), crypto.randomFill(), crypto.generateKeyPair()

  • dns.lookup() all zlib *APIs, other than those that are explicitly synchronous.

So we don't have direct access to the Libuv thread pool. We may define our own uses of the thread pool using C++ add-ons.

Blocking calls

Nodejs execute blocking code in the main thread. fs.readfileSync(), compression-algorithm, encrypting data, image-resize, calculating primes for the large range are some examples of blocking operation. Nodejs golden rule is never block event-loop(main thread). We can execute these operations asynchronously by creating child process using cluster module or child-process module. But creating a child process is a heavy task in terms of OS resources and that's why worker-thread was born.

Using worker-thread you can execute blocking javascript code in worker-thread hence unblocking the main thread and you can communicate to parent thread(main thread) via message passing. Worker threads are still lightweight as compared to a child process.

Read more here:

https://nodesource.com/blog/worker-threads-nodejs

https://blog.insiderattack.net/deep-dive-into-worker-threads-in-node-js-e75e10546b11

Upvotes: 6

Related Questions