OWF12/OSDC.Fr Golang concurrency patterns

24
Faisons travailler des gophers ensemble PROGRESS 1

Transcript of OWF12/OSDC.Fr Golang concurrency patterns

Page 1: OWF12/OSDC.Fr Golang concurrency patterns

Faisonstravaillerdesgophersensemble

PROGRESS 1

Page 2: OWF12/OSDC.Fr Golang concurrency patterns

Présentation

PROGRESS 2

Page 3: OWF12/OSDC.Fr Golang concurrency patterns

BrunoMichelBrunoMichel✰ Directeur Technique d 'D irecteur Technique d ' a f83af83

✰ Déve loppeur de Déve loppeur de L inuxFr.orgLinuxFr.org

✰ Anc ienp rés ident de Anc ienp rés ident de Ruby F ranceRuby F rance

✰ github. com/nonogithub. com/nono

✰ twitter. com/brmiche ltwitter. com/brmiche l

PROGRESS 3

Page 4: OWF12/OSDC.Fr Golang concurrency patterns

GophersGophers«« Gaufre (ou gauphre) est un nomvernacu la ire ambigu en f rança is , pouvant dés ignerGaufre (ou gauphre) est un nomvernacu la ire ambigu en f rança is , pouvant dés igner

des rongeurs […]des rongeurs […] »»—— Wik ipéd i aWik i péd i a

PROGRESS4

Page 5: OWF12/OSDC.Fr Golang concurrency patterns

GoGo✰ Langage Open Source , géré pa r la communautéLangage Open Source , géré pa r la communauté

✰ Une vers ion s table , Go 1Une vers ion s table , Go 1

✰ Langage moderne et agréable à uti l ise rLangage moderne et agréable à uti l ise r

✰ Pour fa ire des logic ie ls s imp les , performants et f iablesPour fa ire des logic ie ls s imp les , performants et f iables

PROGRESS 5

Page 6: OWF12/OSDC.Fr Golang concurrency patterns

Concurrenceetparallélisme

PROGRESS 6

Page 7: OWF12/OSDC.Fr Golang concurrency patterns

ConcurrenceConcurrence«« P rogrammingas the composit ion o f independently executingP rogrammingas the composit ion o f independently executing

p rocesses .p rocesses . »»—— Rob P i k eRob P i k e

PROGRESS7

Page 8: OWF12/OSDC.Fr Golang concurrency patterns

ParallélismeParallélisme«« P rogramming a s t he s imul t aneous execut i on o f (poss i b l y re l a ted ) computa t i ons .Programming a s t he s imul t aneous execut i on o f (poss i b l y re l a ted ) computa t i ons . »»

—— Ro b P ik eRo b P ik e

PROGRESS8

Page 9: OWF12/OSDC.Fr Golang concurrency patterns

Concurrencevs.parallélismeConcurrencevs.parallélismeConcurrence : une questionde s tructure de donnéesConcurrence : une questionde s tructure de données

Pa ra l lé l isme : à p ropos de l 'exécutionPa ra l lé l isme : à p ropos de l 'exécution

PROGRESS 9

Page 10: OWF12/OSDC.Fr Golang concurrency patterns

LesprimitivesdeGo

PROGRESS10

Page 11: OWF12/OSDC.Fr Golang concurrency patterns

GoroutineGoroutinefunccomputation(nint){time.Sleep(n*time.Milliseconds)fmt.Printf("%ssecondselapsed\n",n)}gocomputation(33)gocomputation(11)gocomputation(55)computation(77)

PROGRESS11

Page 12: OWF12/OSDC.Fr Golang concurrency patterns

ChannelsChannelsfuncpingpong(chchanint){n:=<-chfmt.Printf("Received%d\n",n)ch<-n}

funcmain(){ch:=make(chanint)gopingpong(ch)ch<-4242<-ch}

PROGRESS12

Page 13: OWF12/OSDC.Fr Golang concurrency patterns

BufferedChannelsBufferedChannelsfuncpingpong(chchanint){n:=<-chfmt.Printf("Received%d\n",n)ch<-n}

funcmain(){ch:=make(chanint,55)gopingpong(ch)ch<-4242<-ch}

PROGRESS13

Page 14: OWF12/OSDC.Fr Golang concurrency patterns

SelectSelectselect{casechan1<-nb:fmt.Printf("c1")casestr:=<-chan2:fmt.Printf("c2")casestr:=<-chan3:fmt.Printf("c3")}

PROGRESS14

Page 15: OWF12/OSDC.Fr Golang concurrency patterns

Quelquespatterns

PROGRESS15

Page 16: OWF12/OSDC.Fr Golang concurrency patterns

GénerateurGénerateurfuncidGenerator()chanint{ids:=make(chanint)gofunc(){id:=00for{ch<-idid++}}returnids}

ids:=idGenerator()id1:=<-idsid2:=<-ids

PROGRESS16

Page 17: OWF12/OSDC.Fr Golang concurrency patterns

TimeoutTimeout

select{casen:=<-ch:fmt.Printf("Received%d",n)case<-time.After(22*time.Seconds)fmr.Printf("Toolate")}

PROGRESS17

Page 18: OWF12/OSDC.Fr Golang concurrency patterns

TickersTickersticker:=time.NewTicker(5050*time.Millisecond)gofunc(){fort:=rangeticker.C{fmt.Println("Tickat",t)}}()

time.Sleep(150150*time.Millisecond)ticker.Stop()

PROGRESS18

Page 19: OWF12/OSDC.Fr Golang concurrency patterns

WorkerWorkerfuncworker(in<-chan*Work,outchan<-*Work){forw:=rangein{w.z=w.x*w.ySleep(w.z)out<-w}}

PROGRESS19

Page 20: OWF12/OSDC.Fr Golang concurrency patterns

LoadbalancerLoadbalancerfuncRun(){in:=make(chan*Work)out:=make(chan*Work)fori:=00;i<NumWorkers;i++{goworker(in,out)}gosendLotsOfWork(in)receiveLotsOfResults(out)}

PROGRESS20

Page 21: OWF12/OSDC.Fr Golang concurrency patterns

Conclusion

PROGRESS21

Page 22: OWF12/OSDC.Fr Golang concurrency patterns

Goroutines+Channels=<3Goroutines+Channels=<3✰ Ni mutexNi mutex

✰ Ni semaphoreNi semaphore

✰ Ma is c'est très puissantMa is c'est très puissant

PROGRESS22

Page 23: OWF12/OSDC.Fr Golang concurrency patterns

MiseenapplicationMiseenapplicationExterna l images for L inuxFr.orgExterna l images for L inuxFr.org

https ://github. com/nono/ img-LinuxFr.orghttps ://github. com/nono/ img-LinuxFr.org

PROGRESS23

Page 24: OWF12/OSDC.Fr Golang concurrency patterns

PourallerplusloinPourallerplusloinConcurrency is not Pa ra l le l ism ( it's better) —Rob P ikeConcurrency is not Pa ra l le l ism ( it's better) —Rob P ike

http ://waza .heroku. com/http ://waza .heroku. com/

PROGRESS24