concorrência e paralelismo em go

32
Concorrência e Paralelismo em Go Francisco Souza @franciscosouza

Upload: francisco-souza

Post on 06-May-2015

302 views

Category:

Technology


3 download

DESCRIPTION

Palestra apresentada no DevCamp 2014, sobre concorrência e paralelismo em Go.

TRANSCRIPT

Page 1: Concorrência e paralelismo em Go

Concorrência e Paralelismo em Go

Francisco Souza @franciscosouza

Page 2: Concorrência e paralelismo em Go

what the f**rancisco?!

• Globo.com

• tsuru

• Go

Page 3: Concorrência e paralelismo em Go

Concorrência & Paralelismo

Page 4: Concorrência e paralelismo em Go

http://vimeo.com/49718712

Page 5: Concorrência e paralelismo em Go

Por que?

Page 6: Concorrência e paralelismo em Go

The free lunch is over

Page 7: Concorrência e paralelismo em Go

“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

“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

Threading

Page 10: Concorrência e paralelismo em Go

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

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

“Threading is a performance hack- Eric S. Raymond, 2003 ”

Page 13: Concorrência e paralelismo em Go

Communicating Sequential Processes

Page 14: Concorrência e paralelismo em Go

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

Em Go

• Processos = goroutines

• Canais = canais :)

Page 16: Concorrência e paralelismo em Go

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

Canais

type  Person  struct  {     Name  string  }  !type  Elevator  struct  {     number  int     people  chan  Person  }

Page 18: Concorrência e paralelismo em Go

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

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

select

Page 21: Concorrência e paralelismo em Go

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

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

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

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

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

Sincronização

• Mutex

• RWMutex

• Once

• WaitGroup

Page 27: Concorrência e paralelismo em Go

Once

var  once  sync.Once  ...  once.Do(func()  {          CreateDatabasePoll("localhost:27107",  "db")  })

Page 28: Concorrência e paralelismo em Go

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

Operações atômicas

Page 30: Concorrência e paralelismo em Go

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

GOMAXPROCS

• Nível de paralelismo definido em tempo de execução

• runtime.GOMAXPROCS

• env GOMAXPROCS

Page 32: Concorrência e paralelismo em Go

Concorrência e Paralelismo em GoFrancisco Souza @franciscosouza [email protected]