Hemanth's Scribes

web

Blocking vs Non-blocking in node.js

Author Photo

Hemanth HM

Thumbnail

Blocking vs Non-blocking in node.js

The most common task that any developer would do is File I/O, this being a very fundamental process :

  • Open a File.

  • Read it’s contents and print.

  • Do something else.

Let’s see how this can be done with blocking and non-blocking code in node.js and see how it matter!

What we trying to do here, is reading tow simple files : hosts and users and printing there contents, meanwhile printing few hello msgs.

Contents of hosts file :

192.168.1.1 127.0.0.1 255.255.255.0

Contents of users file :

hemanth lenord monkey cat

Blocking or Synchronous code :

var fs = require(‘fs’);

var contents = fs.readFileSync(‘users’,‘utf8’);

console.log(contents);

console.log(“Hello Node\n”);

var contents = fs.readFileSync(‘hosts’,‘utf8’);

console.log(contents);

console.log(“Hello again!”);

Let’s observer the output for a while, before we dig into blocking or Synchronous code :


Hello Node

192.168.1.1 127.0.0.1 255.255.255.0

Hello again! ```javascript

Now relate the output to the code, we may notice the below major points :

  * It's a blocking code i.e until the read operation is completed, the next lines of code is not executed.

  * We see the contents of the user file, the 'Hello Node' strongly support the above point.

  * Same happens with the next file.

**Blocking or Asynchronous code :**

var fs = require('fs');

var contents = fs.readFile('./users','utf8', function(err,contents){ console.log(contents); }); console.log("Hello Node\n");

var contents = fs.readFile('./hosts','utf8', function(err,contents){ console.log(contents); }); console.log("Hello again!"); 

Let's observer the output again, before we dig into blocking or asynchronous code :

``` Hello Node

Hello again!

hemanth lenord monkey cat

192.168.1.1 127.0.0.1 255.255.255.0 ~~~

Comparing the previous output from sync code, we can conclude the below points with async code :

  * It's non-blocking as we can see from the output.

  * "Hello Node', "Hello again" and then the file contents are printed supporting the above point.

Let's try to understand more about asynchronous code :

Reading the file content looks something like :

var contents = fs.readFile('./users','utf8', function(err,contents){ console.log(contents); }); 

Looks, bit strange for one who is doing async code for the first time, but to make it simple, see the std def :

fs.readFile(filename, [encoding], [callback]) 

Compare the above with to sync call :

fs.readFileSync(filename, [encoding]) 

So we notice that **[callback]** is the extract param, and that is function(err,contents) in our case.

**So what is callback?!**

Callback is a reference to a piece of executable code that is passed as an argument to other code. In our case we are passing a function!

Thus, using a callback we are achieving asynchronous behavior i.e non-blocking, as in the code shall proceed further and not wait until the read is complete, later one when the read is completed it prints the contents.

Well, this was a simple example of reading a file, just imagine a web-service that is coded in node.js it would really matter that code reamins as asynchronous as possible or else you shall have angry users!
#javascript#linux
Author Photo

About Hemanth HM

Hemanth HM is a Sr. Machine Learning Manager at PayPal, Google Developer Expert, TC39 delegate, FOSS advocate, and community leader with a passion for programming, AI, and open-source contributions.