Skip to content

Instantly share code, notes, and snippets.

@ghaiklor
Created March 25, 2016 18:44
Show Gist options
  • Save ghaiklor/9682b79353aade8a1e59 to your computer and use it in GitHub Desktop.
Save ghaiklor/9682b79353aade8a1e59 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'));
@Samjin
Copy link

Samjin commented Aug 25, 2021

Is there a way to tell blocking event from CPU flamechart? Even though a task can be promised, if it's a heavy task, it can still block next event loop right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment