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!
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.