Parallel Universes | Node.js

Multithreading

Nairi Harutyunayn

@nairihar / contact me here!

Sr. Backend Engineer @ Screenful

Co-founder of Node.js Armenia 🖤

💛 javascriptarmenia

🖤 nodejsarmenia

💙 reactarmenia

💚 vuejsarmenia

Find us on Facebook!

Join US in Telegram!

Stereotypes about JS/Node.js 

Let's break them!

JavaScript

*simpler than you think

Manager                        

<-> Workers

Do not occupy the manager!

Node.js

Thread Pool

File I/O

DNS

...

Blocking I/O

Thread Pool

UV_THREADPOOL_SIZE=8 (SIZE<=128)

Thread pool

Blocking I/O

CPU intensive

NOW: Up to 1024 threads (after libuv v1.30.0 or node v12.5.0)

Worker Threads

Main Thread <-> Thread communication

Thread <-> Thread communication

Shared* Buffers

Race condition

Atomics

@nairihar/funthreads

Special thanks to

Gagik Harutyunyan

Resources*

Please don't forget to read the rules!

Big thanks to those who support

the JS community ...

Thank You!

Thanks to organizer!

@nairihar

Special thanks to Varser!

Cluster | Child Process

fork(), spawn(), ...

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isPrimary) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  
  // ...
} else {
  // Workers can share any TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);
}
// Main process -> main.js

const { Worker } = require('worker_threads');

const worker = new Worker('./worker.js');

worker.on('message', (msg) => {
  console.log('Message', msg);
});

worker.on('error', console.error);

worker.on('exit', (code) => {
  console.log('Exit', code);
});

// Thread -> worker.js

const { parentPort } = require("worker_threads");

parentPort.postMessage('Greetings from thread!');

$ node script.js

Message Greetings from thread!
Exit 0
Made with Slides.com