Slide 1

Slide 1 text

#multithreaded J AVA S C R I P T P A R A L L E L I S M @ j e f f r e y s t r a u ss

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Intel 80286 25 MHZ CPU 1 MB RAM 3.5" & 5.25" FLOPPY 40 MB HDD

Slide 6

Slide 6 text

$1,500

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

8x faster

Slide 10

Slide 10 text

moore's law

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

gate length: si atom: ~3 nm ~0.3 nm

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

concurrency vs parallelism

Slide 21

Slide 21 text

steak salad table

Slide 22

Slide 22 text

steak salad table

Slide 23

Slide 23 text

steak salad table

Slide 24

Slide 24 text

steak salad table

Slide 25

Slide 25 text

steak salad table

Slide 26

Slide 26 text

steak salad table

Slide 27

Slide 27 text

steak salad table parallelism

Slide 28

Slide 28 text

javascript concurrency CALLBACKS PROMISES ASYNC / AWAIT

Slide 29

Slide 29 text

event loop CALLBACKS PROMISES ASYNC / AWAIT

Slide 30

Slide 30 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP CALL STACK EXTERNAL API CALLBACK QUEUE

Slide 31

Slide 31 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() log('Start') CALL STACK EXTERNAL API CALLBACK QUEUE

Slide 32

Slide 32 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API CALLBACK QUEUE setTimeout(...)

Slide 33

Slide 33 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API 100ms timer CALLBACK QUEUE

Slide 34

Slide 34 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API 100ms timer log(2) CALLBACK QUEUE

Slide 35

Slide 35 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API log('Callback') CALLBACK QUEUE

Slide 36

Slide 36 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API log ('Callback') CALLBACK QUEUE

Slide 37

Slide 37 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API CALLBACK QUEUE log ('Callback') log('End')

Slide 38

Slide 38 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP log('Callback') CALL STACK EXTERNAL API CALLBACK QUEUE

Slide 39

Slide 39 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP CALL STACK EXTERNAL API CONSOLE OUTPUT Start 2 End Callback

Slide 40

Slide 40 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 0); let sum = 1 + 1; console.log(sum); console.log('End'); } EVENT LOOP CALL STACK EXTERNAL API CONSOLE OUTPUT Start 2 End Callback

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let result = blockingCode(); console.log(result); console.log('End'); } EVENT LOOP demo() CALL STACK EXTERNAL API 100ms timer blockingCode() CALLBACK QUEUE

Slide 43

Slide 43 text

EVENT LOOP demo() CALL STACK EXTERNAL API blockingCode() CALLBACK QUEUE this blocks callback execution log ('Callback') function demo() { console.log('Start') setTimeout(() => { console.log('Callback'); }, 100); let result = blockingCode(); console.log(result); console.log('End'); }

Slide 44

Slide 44 text

demo

Slide 45

Slide 45 text

web workers

Slide 46

Slide 46 text

new Worker()

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

postMessage()

Slide 49

Slide 49 text

onmessage

Slide 50

Slide 50 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 51

Slide 51 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 52

Slide 52 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 53

Slide 53 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 54

Slide 54 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 55

Slide 55 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 56

Slide 56 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 57

Slide 57 text

Main says: Talk to me. // printed by worker Worker says: Here I am. // printed by main thread CONSOLE OUTPUT

Slide 58

Slide 58 text

use cases PREFETCHING DATA CALCULATIONS SPELL CHECK MASSIVE DATA IMAGE PROCESSING

Slide 59

Slide 59 text

considerations

Slide 60

Slide 60 text

cleanup

Slide 61

Slide 61 text

close()

Slide 62

Slide 62 text

worker.terminate()

Slide 63

Slide 63 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') close(); }; WORKER.JS

Slide 64

Slide 64 text

let w = new Worker(worker.js); w.onmessage = (e) => { console.log( `Worker says: ${e.data}` ); }; w.postMessage('Talk to me.'); w.terminate(); MAIN.JS onmessage = (e) => { console.log( `Main says: ${e.data}` ); postMessage('Here I am.') }; WORKER.JS

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

am i closed?

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

pick up after yourself

Slide 70

Slide 70 text

access limitations DOM GLOBAL SCOPE PARENT FUNCTIONS WINDOW

Slide 71

Slide 71 text

communication

Slide 72

Slide 72 text

sharing data

Slide 73

Slide 73 text

sharing data

Slide 74

Slide 74 text

copying sharing data

Slide 75

Slide 75 text

let w = new Worker(worker.js); let foo = { x: 1, y: 2 }; w.onmessage = (e) => { console.log( `My x is: ${foo.x} Worker x is: ${e.data.x}` ); }; w.postMessage(foo); MAIN.JS let foo; onmessage = (e) => { foo = e.data; foo.x = 42; postMessage(foo) }; WORKER.JS

Slide 76

Slide 76 text

let w = new Worker(worker.js); let foo = { x: 1, y: 2 }; w.onmessage = (e) => { console.log( `My x is: ${foo.x} Worker x is: ${e.data.x}` ); }; w.postMessage(foo); MAIN.JS let foo; onmessage = (e) => { foo = e.data; foo.x = 42; postMessage(foo) }; WORKER.JS

Slide 77

Slide 77 text

let w = new Worker(worker.js); let foo = { x: 1, y: 2 }; w.onmessage = (e) => { console.log( `My x is: ${foo.x} Worker x is: ${e.data.x}` ); }; w.postMessage(foo); MAIN.JS let foo; onmessage = (e) => { foo = e.data; foo.x = 42; postMessage(foo) }; WORKER.JS

Slide 78

Slide 78 text

let w = new Worker(worker.js); let foo = { x: 1, y: 2 }; w.onmessage = (e) => { console.log( `My x is: ${foo.x} Worker x is: ${e.data.x}` ); }; w.postMessage(foo); MAIN.JS let foo; onmessage = (e) => { foo = e.data; foo.x = 42; postMessage(foo) }; WORKER.JS

Slide 79

Slide 79 text

My x is: 1 // original object literal Worker x is: 42 // modified by worker code CONSOLE OUTPUT

Slide 80

Slide 80 text

structured clone algorithm

Slide 81

Slide 81 text

excludes ERROR & FUNCTION DOM NODES PROTOTYPE CHAIN DESCRIPTORS

Slide 82

Slide 82 text

transferring sharing data

Slide 83

Slide 83 text

postMessage(foo, [trans])

Slide 84

Slide 84 text

let arrBuff = new ArrayBuffer(1024) let foo = { key: 'foo_buffer', buffer: arrBuff }; let w = new Worker(worker.js); w.postMessage(foo, [arrBuff]); MAIN.JS

Slide 85

Slide 85 text

let arrBuff = new ArrayBuffer(1024) let foo = { key: 'foo_buffer', buffer: arrBuff }; let w = new Worker(worker.js); w.postMessage(foo, [arrBuff]); MAIN.JS

Slide 86

Slide 86 text

benefits MUCH FASTER LESS MEMORY

Slide 87

Slide 87 text

drawbacks ARRAY BUFFERS IMAGE BITMAPS

Slide 88

Slide 88 text

drawbacks ONE THREAD AT A TIME

Slide 89

Slide 89 text

broadcast channels

Slide 90

Slide 90 text

shared browser context

Slide 91

Slide 91 text

// could be any executing context let channel = new BroadcastChannel("foo"); // listens to message on channel 'foo' from anyone foo.onmessage = (e) => console.log(e.data); // posts message to anyone who is listening to 'foo' foo.postMesage('Is there anybody out there?'); MAIN.JS / WORKER.JS

Slide 92

Slide 92 text

// could be any executing context let channel = new BroadcastChannel("foo"); // listens to message on channel 'foo' from anyone foo.onmessage = (e) => console.log(e.data); // posts message to anyone who is listening to 'foo' foo.postMesage('Is there anybody out there?'); MAIN.JS / WORKER.JS

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

supports tabs & workers

Slide 95

Slide 95 text

same origin

Slide 96

Slide 96 text

e.data still a copy

Slide 97

Slide 97 text

shared memory

Slide 98

Slide 98 text

No content

Slide 99

Slide 99 text

SharedArrayBuffer

Slide 100

Slide 100 text

// set aside 1KB of shared memory let sab = new SharedArrayBuffer(1024); // create a view on the shared memory with 256 Int32 let intArray = new Int32Array(sab); let w = new Worker(worker.js); w.postMessage(intArray); MAIN.JS

Slide 101

Slide 101 text

// set aside 1KB of shared memory let sab = new SharedArrayBuffer(1024); // create a view on the shared memory with 256 Int32 let intArray = new Int32Array(sab); let w = new Worker(worker.js); w.postMessage(intArray); MAIN.JS

Slide 102

Slide 102 text

// set aside 1KB of shared memory let sab = new SharedArrayBuffer(1024); // create a view on the shared memory with 256 Int32 let intArray = new Int32Array(sab); let w = new Worker(worker.js); w.postMessage(intArray); MAIN.JS

Slide 103

Slide 103 text

let workerIntArray; onmessage = (e) => { // same instance accessing the same memory workerIntArray = e.data; Atomics.store(workerIntArray, 42, 500); }; WORKER.JS

Slide 104

Slide 104 text

No content

Slide 105

Slide 105 text

Atomics

Slide 106

Slide 106 text

Atomics .LOAD (ARR, INDEX) .STORE (ARR, IND, VAL) .SUB (ARR, IND, VAL) .AND / .OR / .XOR

Slide 107

Slide 107 text

Atomics .WAIT(ARR, IND, VAL) .WAKE(ARR, IND, NUM)

Slide 108

Slide 108 text

No content

Slide 109

Slide 109 text

W H E R E T O G O F R O M H E R E experiment

Slide 110

Slide 110 text

identify

Slide 111

Slide 111 text

keep watch

Slide 112

Slide 112 text

#multithreaded [email protected] @ j e f f r e y s t r a u ss