Successfully reported this slideshow.
Concorrência e Paralelismo em Go
Francisco Souza
@franciscosouza
what the f**rancisco?!
• Globo.com
• tsuru
• Go
Concorrência &
Paralelismo
http://vimeo.com/49718712
Por que?
The free lunch is over
“Most classes of applications
have enjoyed free and regular
performance gains for several
decades, even without releasing
...
“Concurrency is not just for doing
more things faster. It's for writing
better code.
- Andrew Gerrand, 2014
”
Threading
static	
  long	
  values_sum	
  =	
  0;	
  
!
int	
  
main(void)	
  
{	
  
	
   thrd_t	
  threads[NTHREADS];	
  
	
   long...
int	
  
sum(void	
  *arg)	
  
{	
  
	
   long	
  id	
  =	
  (long)arg;	
  
	
   int	
  i,	
  start,	
  end;	
  
	
   start...
“Threading is a
performance hack
- Eric S. Raymond, 2003
”
Communicating
Sequential Processes
PROC	
  foo	
  (CHAN	
  INT	
  out!)	
  
	
  	
  	
  	
  out	
  !	
  42	
  
:	
  
!
PROC	
  bar	
  (CHAN	
  INT	
  in?)	
 ...
Em Go
• Processos = goroutines
• Canais = canais :)
goroutines ping-pong
func	
  play(msg	
  string)	
  {	
  
	
   for	
  {	
  
	
   	
   fmt.Println(msg)	
  
	
   	
   time....
Canais
type	
  Person	
  struct	
  {	
  
	
   Name	
  string	
  
}	
  
!
type	
  Elevator	
  struct	
  {	
  
	
   number	
...
Canais
func	
  main()	
  {	
  
	
   nPeople	
  :=	
  flag.Int("people",	
  100,	
  "Number	
  of	
  people")	
  
	
   nEle...
Canais
func	
  (e	
  *Elevator)	
  Start()	
  {	
  
	
   go	
  func()	
  {	
  
	
   	
   for	
  p	
  :=	
  range	
  e.peop...
select
select
func	
  elevator(name	
  string)	
  chan<-­‐	
  Person	
  {	
  
	
   people	
  :=	
  make(chan	
  Person)	
  
	
   ...
select
	
   people	
  :=	
  []Person{	
  
	
   	
   {Name:	
  "Bob"},	
  {Name:	
  "Mary"},	
  {Name:	
  "Thomas"},	
  
	
...
timeout
respChan	
  :=	
  make(chan	
  []byte)	
  
go	
  doSomethingInTheNetwork(respChan)	
  
select	
  {	
  
case	
  dat...
quit
	
   go	
  func()	
  {	
  
	
   	
   conn	
  :=	
  r.pool.Get()	
  
	
   	
   defer	
  conn.Close()	
  
	
   	
   var...
quit + timeout
	
   var	
  payload	
  []byte	
  
	
   select	
  {	
  
	
   case	
  payload	
  =	
  <-­‐payloadChan:	
  
	
...
Sincronização
• Mutex
• RWMutex
• Once
• WaitGroup
Once
var	
  once	
  sync.Once	
  
...	
  
once.Do(func()	
  {	
  
	
  	
  	
  	
  CreateDatabasePoll("localhost:27107",	
 ...
WaitGroup
• “fork-join"
	
   var	
  containersGroup	
  sync.WaitGroup	
  
	
   for	
  _,	
  container	
  :=	
  range	
  co...
Operações atômicas
Paralelismo:
Implícito x Explícito
• Concorrência: forma como você estrutura seu
programa
• Paralelismo: forma como você e...
GOMAXPROCS
• Nível de paralelismo definido em tempo de
execução
• runtime.GOMAXPROCS
• env GOMAXPROCS
Concorrência e Paralelismo em Go
Francisco Souza
@franciscosouza
fss@corp.globo.com
Upcoming SlideShare
Loading in …5
×

Concorrência e paralelismo em Go

943 views

Published on

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

Published in: Technology, Business
  • Be the first to comment

Concorrência e paralelismo em Go

  1. 1. Concorrência e Paralelismo em Go Francisco Souza @franciscosouza
  2. 2. what the f**rancisco?! • Globo.com • tsuru • Go
  3. 3. Concorrência & Paralelismo
  4. 4. http://vimeo.com/49718712
  5. 5. Por que?
  6. 6. The free lunch is over
  7. 7. “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
  8. 8. “Concurrency is not just for doing more things faster. It's for writing better code. - Andrew Gerrand, 2014 ”
  9. 9. Threading
  10. 10. 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("%ldn",  values_sum);   }
  11. 11. 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;   }
  12. 12. “Threading is a performance hack - Eric S. Raymond, 2003 ”
  13. 13. Communicating Sequential Processes
  14. 14. PROC  foo  (CHAN  INT  out!)          out  !  42   :   ! PROC  bar  (CHAN  INT  in?)          INT  v:          SEQ                  in  ?  v   :
  15. 15. Em Go • Processos = goroutines • Canais = canais :)
  16. 16. goroutines ping-pong func  play(msg  string)  {     for  {       fmt.Println(msg)       time.Sleep(100e6)     }   }   ! func  main()  {     go  play("ping")     go  play("pong")     time.Sleep(2e9)   }
  17. 17. Canais type  Person  struct  {     Name  string   }   ! type  Elevator  struct  {     number  int     people  chan  Person   }
  18. 18. Canais func  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)   }
  19. 19. 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))       }     }()   }
  20. 20. select
  21. 21. select func  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   }
  22. 22. 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:       }     }  
  23. 23. 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”)   }
  24. 24. 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)     }()  
  25. 25. 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}     }
  26. 26. Sincronização • Mutex • RWMutex • Once • WaitGroup
  27. 27. Once var  once  sync.Once   ...   once.Do(func()  {          CreateDatabasePoll("localhost:27107",  "db")   })
  28. 28. WaitGroup • “fork-join"   var  containersGroup  sync.WaitGroup     for  _,  container  :=  range  containers  {       containersGroup.Add(1)       go  collectUnit(container,  units,  &containersGroup)     }     containersGroup.Wait()
  29. 29. Operações atômicas
  30. 30. Paralelismo: Implícito x Explícito • Concorrência: forma como você estrutura seu programa • Paralelismo: forma como você executa seu programa
  31. 31. GOMAXPROCS • Nível de paralelismo definido em tempo de execução • runtime.GOMAXPROCS • env GOMAXPROCS
  32. 32. Concorrência e Paralelismo em Go Francisco Souza @franciscosouza fss@corp.globo.com

×