lecture 11 - national university of singaporecs2030/1718-s2/cs2030-lec11.pdf · lecture 11...

54

Upload: others

Post on 27-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent
Page 2: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Lecture 11Asynchronous Calls

Page 3: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Previously, in cs2030..

Page 4: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Sequential Program

Page 5: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Concurrent Program

Page 6: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Concurrent Program

thread

Page 7: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Parallel Program

Page 8: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Good for Parallelization

• Non-interference

• Stateless

• No side-effect

• Associative Reduction

Page 9: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

protected Integer compute() { // stop splitting if small enough if (high - low < FORK_THRESHOLD) { int sum = 0; for (int i = low; i < high; i++) { sum += array[i]; } return sum; }

int middle = (low + high) / 2; Summer left = new Summer(low, middle, array); Summer right = new Summer(middle, high, array); left.fork(); return right.compute() + left.join(); }

Page 10: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7 .compute()

Page 11: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute().fork()

Page 12: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute()

4 - 5 6 - 7 .compute().fork()

Page 13: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute()

4 - 5 6 - 7 .compute()

6

Page 14: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute()

4 - 5 .join()

6

Page 15: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute()

614

0 - 1 2 - 3

Page 16: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

3 3 1 3 6 8 4 2

0 1 2 3 4 5 6 7

Summer: 0 - 7

Summer: 0 - 3 Summer: 4 - 7

.compute()

.compute()

20

.join()

10

Page 17: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

ForkJoinPool

thread pool

worker thread

global taskqueue

local task queue

Page 18: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

Task Summer(0, 3) arrives

Page 19: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

Worker 1 is idle. Took Task 0-3 to compute( )

Page 20: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

4 - 5

Meanwhile Task 4-5 enters queue

Page 21: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

4 - 5

Worker 2 is idle. Take Task 4-5 to compute( )

Page 22: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

4 - 5

0 - 1

Task 0-3 fork() 0-1. 0-1 joins the task queue

Page 23: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3 0 - 1

Worker 2 done with 4-5 and is now idle.Look for tasks to do. Take 0-1

Page 24: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

0 - 1

Now Task 0-3 calls 0-1.join() and is waiting.(note Worker 1 is blocked)

Page 25: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

Task 0-1 is done. Task 0-3 can unblock.

Page 26: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

Task 0-3 is done. Worker 1 idle.

Page 27: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

If all the tasks blocks, new worker thread is created.

blocked

blocked

Page 28: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

protected Integer compute() { // stop splitting if small enough if (high - low < FORK_THRESHOLD) { int sum = 0; for (int i = low; i < high; i++) { sum += array[i]; } return sum; }

int middle = (low + high) / 2; Summer left = new Summer(low, middle, array); Summer right = new Summer(middle, high, array); left.fork(); right.fork(); return right.join() + left.join(); }

Page 29: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

4 - 5

0 - 1

0-3 do a left.fork() then right.fork(). right goes to the head of the queue.

2 - 3

Page 30: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

thread pool

global taskqueue

local task queue

0 - 3

Worker 2 “steal” from the end of the queue

0 - 12 - 3

Page 31: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

protected Integer compute() { // stop splitting if small enough if (high - low < FORK_THRESHOLD) { int sum = 0; for (int i = low; i < high; i++) { sum += array[i]; } return sum; }

int middle = (low + high) / 2; Summer left = new Summer(low, middle, array); Summer right = new Summer(middle, high, array); left.fork(); right.fork(); return right.join() + left.join(); }

Page 32: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

a.fork() b.fork() c.fork() c.join() b.join() a.join()

Page 33: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Synchronous Call

Page 34: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Synchronous Call

Page 35: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Asynchronous Call

Page 36: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Future<T>

- cancel()- get()- get(timeout, unit)- isCancelled()- isDone()

RecursiveAction

RecursiveTask

FutureTask

::

implements

CompletableFuture

Page 37: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

computation

fork() isDone() isDone() print

Page 38: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

task.fork(); while (!task.isDone()) { System.out.print("."); } System.out.print("done");

Page 39: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

task.fork(); if (!task.isDone()) { // do something } else { task.join(); } if (!task.isDone()) { // do something else } else { task.join(); } if (!task.isDone()) { // do yet something else } else { task.join(); }

Page 40: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Need a better way to coordinate async tasks

Page 41: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

idea: go run this task, when you are done, run this other task, and then when that is

done, run that task

Page 42: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

callback: when some event happen, do

something

Page 43: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

CompletableFuture .supplyAsync(() -> doSomething()) .thenAccept(System.out::println);

Page 44: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

CompletableFuture .supplyAsync(() -> doSomething()) .join();

Page 45: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

CompletableFuture .supplyAsync(() -> doSomething())

Page 46: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

<U> CompletableFuture<U> thenApply( Function<? super T,? extends U> func)

CompletableFuture is a Functor

Page 47: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

<U> CompletableFuture<U> thenCompose( Function<? super T, ? extends CompletionStage<U>> func)

and a Monad!

Page 48: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

x f(x)

f : T -> R

“modify things in a box”

Page 49: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

Monad

Monad<T> Monad<R>

f : T -> Monad<R>

Explained in OO way

Page 50: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

MonadExplained in OO way

Class Context / Box

Stream A sequence of values

Optional A value that maybe there

CompletableFuture A value that will be available in the future

Page 51: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

A1 A2

B1

xB1

B2

= A1 B1x A2 B2x+

Page 52: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

+

x x

A1 B1 A2 B2

thenCombine

supplyAsync supplyAsync

Page 53: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

CompletableFuture left = .supplyAsync(() -> a1.multiply(b1));

CompletableFuture right = .supplyAsync(() -> a2.multiply(b2)) .thenCombine(left, (m1, m2) -> m1.add(m2)); .thenAccept(System.out::println);

Page 54: Lecture 11 - National University of Singaporecs2030/1718-s2/cs2030-lec11.pdf · Lecture 11 Asynchronous Calls. Previously, in cs2030.. Sequential Program. Concurrent Program. Concurrent

• To create: runAsync, supplyAsync

• then<X><Y>:

• X is Accept, Run, Combine, Compose

• Y is nothing, Both, BothAsync, Either, EitherAsync