-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #33 from fabianoflorentino/development
Development to Main
- Loading branch information
Showing
7 changed files
with
148 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
--- | ||
description: | ||
name: "Capítulo 18: Concorrência" | ||
sections: | ||
- title: "Concorrência vs Paralelismo" | ||
text: | | ||
- Concorrência é quando abre uma padaria do lado da outra e as duas quebram :) | ||
- Fun facts: | ||
- O primeiro CPU dual core "popular" veio em 2006 | ||
- Em 2007 o Google começou a criar a linguagem Go para utilizar essa vantagem | ||
- Go foi a primeira linguagem criada com multi-cores em mente | ||
- C, C++, C#, Java, JavaScript, Python, etc., foram todas criadas antes de 2006 | ||
- Ou seja, Go tem uma abordagem única (fácil!) para este tópico | ||
- E qual a diferença entre concorrência e paralelismo? | ||
- title: "Goroutines & WaitGroups" | ||
text: | | ||
- O código abaixo é linear. Como fazer as duas funções rodarem concorrentemente? | ||
- https://play.golang.org/p/XP-ZMeHUk4 | ||
- Goroutines! | ||
- O que são goroutines? São "threads." | ||
- O que são threads? [WP](https://pt.wikipedia.org/wiki/Thread_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)) | ||
- Na prática: go func. | ||
- Exemplo: código termina antes da go func executar. | ||
- Ou seja, precisamos de uma maneira pra "sincronizar" isso. | ||
- Ah, mas então... não. | ||
- Qualé então? sync.WaitGroup: | ||
- Um WaitGroup serve para esperar que uma coleção de goroutines termine sua execução. | ||
- func Add: "Quantas goroutines?" | ||
- func Done: "Deu!" | ||
- func Wait: "Espera todo mundo terminar." | ||
- Ah, mas então... sim! | ||
- Só pra ver: runtime.NumCPU() & runtime.NumGoroutine() | ||
- Go Playground: https://play.golang.org/p/8iiqLX4sWc | ||
- title: "Discussão: Condição de corrida" | ||
text: | | ||
- Agora vamos dar um mergulho na documentação: | ||
- https://golang.org/doc/effective_go.html#concurrency | ||
- https://pt.wikipedia.org/wiki/Multiplexador | ||
- O que é yield? runtime.Gosched() | ||
- Race condition: | ||
*Função 1 var Função 2* | ||
Lendo: 0 → 0 | ||
Yield 0 → Lendo: 0 | ||
var++: 1 Yield | ||
Grava: 1 → 1 var++: 1 | ||
1 ← Grava: 1 | ||
Lendo: 1 ← 1 | ||
Yield 1 → Lendo: 1 | ||
var++: 2 Yield | ||
Grava: 2 → 2 var++: 2 | ||
2 ← Grava: 2 | ||
- E é por isso que vamos ver mutex, atomic e, por fim, channels. | ||
- title: Condição de corrida | ||
text: | | ||
- Aqui vamos replicar a race condition mencionada no artigo anterior. | ||
- time.Sleep(time.Second) vs. runtime.Gosched() | ||
- go help → go help build → go run -race main.go | ||
- Como resolver? Mutex. | ||
- Código: https://github.com/ellenkorbes/aprendago/blob/master/c%C3%B3digo/18_concorrencia/05_race_condition/main.go | ||
- title: Mutex | ||
text: | | ||
- Agora vamos resolver a race condition do programa anterior utilizando mutex. | ||
- Mutex é mutual exclusion, exclusão mútua. | ||
- Utilizando mutex somente uma thread poderá utilizar a variável contador de cada vez, e as outras deve aguardar sua vez "na fila." | ||
- Na prática: | ||
- type Mutex | ||
- func (m *Mutex) Lock() | ||
- func (m *Mutex) Unlock() | ||
- RWMutex | ||
- Código: https://github.com/ellenkorbes/aprendago/blob/master/c%C3%B3digo/18_concorrencia/06_mutex/main.go | ||
- title: Atomic | ||
text: | | ||
- Agora vamos fazer a mesma coisa, mas com atomic ao invés de mutex. | ||
- atomic.AddInt64 | ||
- atomic.LoadInt64 | ||
- Código: https://github.com/ellenkorbes/aprendago/blob/master/c%C3%B3digo/18_concorrencia/07_atomic/main.go |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package concorrencia | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/fabianoflorentino/aprendago/pkg/format" | ||
) | ||
|
||
var rootDir = "internal/concorrencia" | ||
|
||
func Concorrencia() { | ||
fmt.Printf("\n\n18 - Concorrência\n") | ||
|
||
executeSection("Concorrência vs Paralelismo") | ||
executeSection("Goroutines & WaitGroups") | ||
executeSection("Discussão: Condição de corrida") | ||
executeSection("Condição de corrida") | ||
executeSection("Mutex") | ||
executeSection("Atomic") | ||
} | ||
|
||
func MenuConcorrencia([]string) []format.MenuOptions { | ||
return []format.MenuOptions{ | ||
{Options: "--concorrencia-vs-paralelismo", ExecFunc: func() { executeSection("Concorrência vs Paralelismo") }}, | ||
{Options: "--goroutines-waitgroups", ExecFunc: func() { executeSection("Goroutines & WaitGroups") }}, | ||
{Options: "--discussao-condicao-de-corrida", ExecFunc: func() { executeSection("Discussão: Condição de corrida") }}, | ||
{Options: "--condicao-de-corrida", ExecFunc: func() { executeSection("Condição de corrida") }}, | ||
{Options: "--mutex", ExecFunc: func() { executeSection("Mutex") }}, | ||
{Options: "--atomic", ExecFunc: func() { executeSection("Atomic") }}, | ||
} | ||
} | ||
|
||
func HelpMeConcorrencia() { | ||
hlp := []format.HelpMe{ | ||
{Flag: "--concorrencia-vs-paralelismo", Description: "Apresenta a diferença entre concorrência e paralelismo.", Width: 0}, | ||
{Flag: "--goroutines-waitgroups", Description: "Apresenta o uso de goroutines e waitgroups.", Width: 0}, | ||
{Flag: "--discussao-condicao-de-corrida", Description: "Apresenta uma discussão sobre condição de corrida.", Width: 0}, | ||
{Flag: "--condicao-de-corrida", Description: "Apresenta o conceito de condição de corrida.", Width: 0}, | ||
{Flag: "--mutex", Description: "Apresenta o uso de mutex.", Width: 0}, | ||
{Flag: "--atomic", Description: "Apresenta o uso de atomic.", Width: 0}, | ||
} | ||
|
||
fmt.Println("\nCapítulo 18: Concorrência") | ||
format.PrintHelpMe(hlp) | ||
} | ||
|
||
func executeSection(section string) { | ||
format.FormatSection(rootDir, section) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters