concorrência e paralelismo em go
DESCRIPTION
Palestra apresentada no DevCamp 2014, sobre concorrência e paralelismo em Go.TRANSCRIPT
![Page 1: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/1.jpg)
Concorrência e Paralelismo em Go
Francisco Souza @franciscosouza
![Page 2: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/2.jpg)
what the f**rancisco?!
• Globo.com
• tsuru
• Go
![Page 3: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/3.jpg)
Concorrência & Paralelismo
![Page 4: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/4.jpg)
http://vimeo.com/49718712
![Page 5: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/5.jpg)
Por que?
![Page 6: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/6.jpg)
The free lunch is over
![Page 7: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/7.jpg)
“Most classes of applications have enjoyed free and regular performance gains for several decades, even without releasing new versions or doing anything special...- Herb Sutter, 2005 ”
![Page 8: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/8.jpg)
“Concurrency is not just for doing more things faster. It's for writing better code.
- Andrew Gerrand, 2014 ”
![Page 9: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/9.jpg)
Threading
![Page 10: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/10.jpg)
static long values_sum = 0; !int main(void) { thrd_t threads[NTHREADS]; long i; int status; for(i = 0; i < NTHREADS; i++) { thrd_create(&threads[i], sum, (void *)i); } for(i = 0; i < NTHREADS; i++) { thrd_join(threads[i], &status); } printf("%ld\n", values_sum); }
![Page 11: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/11.jpg)
int sum(void *arg) { long id = (long)arg; int i, start, end; start = id * (N / NTHREADS + 1); end = start + (N / NTHREADS + 1); for(i = start; i < end; i++) { if(i < N) { mtx_lock(&mut); values_sum += i; mtx_unlock(&mut); } } return thrd_success; }
![Page 12: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/12.jpg)
“Threading is a performance hack- Eric S. Raymond, 2003 ”
![Page 13: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/13.jpg)
Communicating Sequential Processes
![Page 14: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/14.jpg)
PROC foo (CHAN INT out!) out ! 42 : !PROC bar (CHAN INT in?) INT v: SEQ in ? v :
![Page 15: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/15.jpg)
Em Go
• Processos = goroutines
• Canais = canais :)
![Page 16: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/16.jpg)
goroutines ping-pongfunc play(msg string) { for { fmt.Println(msg) time.Sleep(100e6) } } !func main() { go play("ping") go play("pong") time.Sleep(2e9) }
![Page 17: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/17.jpg)
Canais
type Person struct { Name string } !type Elevator struct { number int people chan Person }
![Page 18: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/18.jpg)
Canaisfunc main() { nPeople := flag.Int("people", 100, "Number of people") nElevators := flag.Int("elevators", 4, "Number of elevators") flag.Parse() people := make(chan Person) for i := 0; i < *nElevators; i++ { e := NewElevator(i, people) e.Start() } for i := 0; i < *nPeople; i++ { name := fmt.Sprintf("person %d", i+1) people <-‐ Person{Name: name} } close(people) }
![Page 19: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/19.jpg)
Canais
func (e *Elevator) Start() { go func() { for p := range e.people { fmt.Printf("elevator %d transporting %s.\n", e.number, p.Name) time.Sleep(time.Duration((rand.Int()%5 + 1) * 1e9)) } }() }
![Page 20: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/20.jpg)
select
![Page 21: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/21.jpg)
selectfunc elevator(name string) chan<-‐ Person { people := make(chan Person) go func() { for p := range people { fmt.Printf("Elevator %q transporting %q...\n", name, p.Name) time.Sleep(1e9) } }() return people }
![Page 22: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/22.jpg)
select people := []Person{ {Name: "Bob"}, {Name: "Mary"}, {Name: "Thomas"}, {Name: "John"}, {Name: "Peter"}, {Name: "Ken"}, {Name: "Patricia"}, {Name: "Ane"}, {Name: "Alice"}, } elevator1 := elevator("social1") elevator2 := elevator("social2") elevator3 := elevator("vip") for _, person := range people { select { case elevator1 <-‐ person: case elevator2 <-‐ person: case elevator3 <-‐ person: } }
![Page 23: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/23.jpg)
timeout
respChan := make(chan []byte) go doSomethingInTheNetwork(respChan) select { case data := <-‐respChan: // do something with data case time.After(5 * time.Second): fmt.Println(“sloooow connection”) }
![Page 24: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/24.jpg)
quit go func() { conn := r.pool.Get() defer conn.Close() var payload interface{} var err error for payload == nil { select { case <-‐quit: return default: payload, err = conn.Do("RPOP", r.key()) if err != nil { errChan <-‐ err return } } } payloadChan <-‐ payload.([]byte) }()
![Page 25: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/25.jpg)
quit + timeout
var payload []byte select { case payload = <-‐payloadChan: case err := <-‐errChan: return nil, err case <-‐time.After(timeout): close(quit) return nil, &timeoutError{timeout: timeout} }
![Page 26: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/26.jpg)
Sincronização
• Mutex
• RWMutex
• Once
• WaitGroup
![Page 27: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/27.jpg)
Once
var once sync.Once ... once.Do(func() { CreateDatabasePoll("localhost:27107", "db") })
![Page 28: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/28.jpg)
WaitGroup• “fork-join"
var containersGroup sync.WaitGroup for _, container := range containers { containersGroup.Add(1) go collectUnit(container, units, &containersGroup) } containersGroup.Wait()
![Page 29: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/29.jpg)
Operações atômicas
![Page 30: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/30.jpg)
Paralelismo: Implícito x Explícito
• Concorrência: forma como você estrutura seu programa
• Paralelismo: forma como você executa seu programa
![Page 31: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/31.jpg)
GOMAXPROCS
• Nível de paralelismo definido em tempo de execução
• runtime.GOMAXPROCS
• env GOMAXPROCS
![Page 32: Concorrência e paralelismo em Go](https://reader034.vdocuments.site/reader034/viewer/2022052522/5549cb28b4c9051c778b4757/html5/thumbnails/32.jpg)
Concorrência e Paralelismo em GoFrancisco Souza @franciscosouza [email protected]