Skip to content

Instantly share code, notes, and snippets.

@bertrandg
Forked from ghaiklor/node-event-loop-demo.js
Created January 13, 2021 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bertrandg/a34b81dd3b9bd36b2537599a2ceb9318 to your computer and use it in GitHub Desktop.
Save bertrandg/a34b81dd3b9bd36b2537599a2ceb9318 to your computer and use it in GitHub Desktop.
This example shows how you can block event loop in NodeJS
'use strict';
// The purpose of this example is to show
// how you can block the event loop with JavaScript.
// There is 3 routes
// / respond with Hello, World text
// /block uses JavaScript while for 5 seconds
// /non-block uses setTimeout for 5 seconds
// Do the following
// curl localhost:3000/
// You get Hello, World
// curl localhost:3000/block and curl localhost:3000/ at once
// your server is blocked now, because of while in JavaScript
// JavaScript code is executed in the main thread, where event loop
// that's why it blocks, because of while execution
// curl localhost:3000/non-block and curl:localhost:3000/ at once
// you will get Hello, World and after 5 seconds I am done
// in this case you don't block the server
// because operation thrown in thread-pool
// freeing the main thread for other connections
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello, World'));
app.get('/block', (req, res) => {
const end = Date.now() + 5000;
while (Date.now() < end) {
const doSomethingHeavyInJavaScript = 1 + 2 + 3;
}
res.send('I am done!');
});
app.get('/non-block', (req, res) => {
// Imagine that setTimeout is IO operation
// setTimeout is a native implementation, not the JS
setTimeout(() => res.send('I am done!'), 5000);
});
app.listen(3000, () => console.log('app listening on port 3000'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment