Created
March 25, 2016 18:44
-
-
Save ghaiklor/9682b79353aade8a1e59 to your computer and use it in GitHub Desktop.
This example shows how you can block event loop in NodeJS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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
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?