+ All Categories
Home > Education > JAZOON'13 - Andrej Vckovski - Go synchronized

JAZOON'13 - Andrej Vckovski - Go synchronized

Date post: 09-May-2015
Category:
Upload: jazoon13
View: 881 times
Download: 1 times
Share this document with a friend
Description:
http://guide13.jazoon.com/#/submissions/125
23
Go Synchronized Andrej Vckovski
Transcript
Page 1: JAZOON'13 - Andrej Vckovski - Go synchronized

Go Synchronized Andrej Vckovski

Page 2: JAZOON'13 - Andrej Vckovski - Go synchronized

What I want to transmit

Go is useful and neat for heavily concurrent applications Webrockets socks!

Go synchronized 2

Page 3: JAZOON'13 - Andrej Vckovski - Go synchronized

A small poll

Point your [smartphone] browser to

nca.me/l Go synchronized 3

Page 4: JAZOON'13 - Andrej Vckovski - Go synchronized

Go synchronized 4

nca.me/l

Page 5: JAZOON'13 - Andrej Vckovski - Go synchronized

Go synchronized 5

nca.me/l

Page 6: JAZOON'13 - Andrej Vckovski - Go synchronized

About go

Started by Robert Griesemer, Rob Pike and Ken Thompson in Fall 2007, Open-sourced 2009, Go 1 March 2012

Main features – C/Pascal/Modula-like, garbage collected, no pointer

arithmetics, type safe, very fast compiler – Simple type system without hierarchies – Concepts for concurrent programming in the “CSP”-style – Embeds dependency management – Today about similar memory/execution-performance as

Java or Node.

Go synchronized 6

Page 7: JAZOON'13 - Andrej Vckovski - Go synchronized

Concurrency?

Separate, potentially simultaneously executed computations

Usually somehow interacting Candidates to leverage multi-{core|cpu|node}

environments Usually but not necessarily correspond to multiple users Often on the server side

And hard to make it right

Go synchronized 7

Page 8: JAZOON'13 - Andrej Vckovski - Go synchronized

Go and concurrency

Communicating Sequential Processes (CSP) pattern (C. A. R. Hoare, 1978) 1. Channels 2. Go-routines 3. select-statement

“Do not communicate by sharing memory; instead, share memory by communicating”

Occam, Erlang, Newsqueak, Limbo, Clojure and many more

Go synchronized 8

Page 9: JAZOON'13 - Andrej Vckovski - Go synchronized

Example

package main import ("fmt"; "time"; "math/rand") func main() { table := make(chan string) for _, player := range [...]string{"alice", "bob"} { go func(who string) { num := 0; for { ball := <- table; fmt.Printf("player %s: %s\n", who, ball) table <- fmt.Sprintf("tick-%s-%d",who,num) time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000))) num++ } }(player) } table <- "go" time.Sleep(10 * time.Second) }

Go synchronized 9

Page 10: JAZOON'13 - Andrej Vckovski - Go synchronized

The application: Very Instant Massive (Audience) Polling Presentations

like this one TV shows with

added interactivity

Pause entertainment in a stadium

Flipped Classrooms

© Loozrboy

© Chris Lawrence

© Jeff Chenqinyi

© Nhenze

Go synchronized 10

Page 11: JAZOON'13 - Andrej Vckovski - Go synchronized

Browser that

displays questions

and allows voting

Presentation Software (e.g., PowerPoint)

Browser that displays voting results

ipoll server

System context

Go synchronized 11

Browser that

displays questions

and allows voting

Browser that

displays questions

and allows voting

go

JS

JS

JS

JS

Page 12: JAZOON'13 - Andrej Vckovski - Go synchronized

Browser that

displays questions

and allows voting

Presentation Software (e.g., PowerPoint)

Browser that displays voting results

ipoll server

Browser that

displays questions

and allows voting

Browser that

displays questions

and allows voting

go

JS

JS

JS

JS

WebSockets

Full-duplex conversation over TCP connection

RFC 6455 Available in most modern

browsers Simple JavaScript binding Handshake by HTTP, then

user-defined messages over the same socket

Client (Browser) Server

HTTP GET Request, special attributes

HTTP response “switch protocol”

Message

Message

Message

Message

Message

Go synchronized 12

Page 13: JAZOON'13 - Andrej Vckovski - Go synchronized

Browser that

displays questions

and allows voting

Presentation Software (e.g., PowerPoint)

Browser that displays voting results

ipoll server

Multiplexer and

Demultiplexer

Go synchronized 13

Browser that

displays questions

and allows voting

Browser that

displays questions

and allows voting

Page 14: JAZOON'13 - Andrej Vckovski - Go synchronized

Small Demo

Point your smartphone browser to

nca.me/l Go synchronized 14

Page 15: JAZOON'13 - Andrej Vckovski - Go synchronized

Demo: New Question 1

Go synchronized 15

nca.me/l

Page 16: JAZOON'13 - Andrej Vckovski - Go synchronized

Demo: New Question 2

Go synchronized 16

nca.me/l

Page 17: JAZOON'13 - Andrej Vckovski - Go synchronized

Demo: New Question 3

Go synchronized 17

nca.me/l

Page 18: JAZOON'13 - Andrej Vckovski - Go synchronized

WebSocket on server side (go) func startWebserver() {

// [...]

http.HandleFunc("/svy", surveyHandler)

// [...]

}

func surveyHandler(c http.ResponseWriter, req *http.Request) { // [...]

go websocket.Handler(func (ws *websocket.Conn) { s.VoterHandler(ws)} ).ServeHTTP(c, req) // [...]

}

func (s *Survey) VoterHandler(ws *websocket.Conn) { defer func() { s.voterChan <- voter{ws, false} log.Printf("connection closed by client") ws.Close() }() s.voterChan <- voter{ws, true} // notify hub of a new voter for { // [...]

len, err := ws.Read(buf) // [...]

var v vote err = json.Unmarshal(buf, &v) if err == nil { s.voteChan <- v } else { // [...]

} } }

Go synchronized 18

Page 19: JAZOON'13 - Andrej Vckovski - Go synchronized

Core data massaged at a single place: The “model” implements an event-loop

func (s *Survey) surveyHub() { // [...] t := time.NewTicker(100 * time.Millisecond) // [...] for { select { case _ = <-t.C: // tick arrived // [...] case ctrl := <-s.controlChan: // control message // [...] case voter := <-s.voterChan: // voter subscribed // [...] case viewer := <-s.viewerChan: // viewer subscribed // [...] case admin := <-s.adminChan: // admin subscribed // [...] case vote := <-s.voteChan: // a vote arrived // [...] } } }

19

Page 20: JAZOON'13 - Andrej Vckovski - Go synchronized

Conclusions

Go (or “CSP”-design) has massively simplified the concurrency challenges WebSockets are easy to use and will be

increasingly popular

Go synchronized 20

Page 21: JAZOON'13 - Andrej Vckovski - Go synchronized

(mascot by Renée French)

Rob Pike on “concurrency is not parallelism”: http://vimeo.com/49718712

http://golang.org

Page 22: JAZOON'13 - Andrej Vckovski - Go synchronized

Bonus poll

Go synchronized 22

nca.me/l

Page 23: JAZOON'13 - Andrej Vckovski - Go synchronized

Thanks for the attention!

[email protected] netcetera.com

ipoll.ch (coming soon)


Recommended