Go: Processos e Concorrência

De Aulas
Revisão de 18h11min de 1 de outubro de 2021 por Admin (discussão | contribs)

Afluentes: Sistemas Distribuídos e Mobile

Subprocessos

 1package main
 2
 3import (
 4	"fmt"
 5	"math/rand"
 6	"sync"
 7	"time"
 8)
 9
10func child(wg *sync.WaitGroup) {
11	defer wg.Done()                   // decrementa o contador de processo
12	fmt.Println("Luke: Noooooo.....") // imprime na tela
13	for i := 0; i < 5; i++ {          // executa o laço 5 vezes
14		fmt.Println("Luke: No!")                        // imprime n a tela
15		d := rand.Intn(2000)                            // retorna um número randômico de 0 a 1999
16		time.Sleep(time.Duration(d) * time.Millisecond) // aguarda um tempo
17	}
18	fmt.Println("Luke Skywalker falls.") // imprime na tela
19}
20
21func main() {
22	var wg sync.WaitGroup                           // wg é tilizado para sincronizar os processos
23	wg.Add(1)                                       // incrementa o contador de processos
24	go child(&wg)                                   // chama a rotina child paralelamente
25	fmt.Println("Vader: Luke! I am your father...") // imprime na tela
26	for i := 0; i < 5; i++ {                        // executa o laço 5 vezes
27		fmt.Println("Vader: Yes!")                      // imprime na tela
28		d := rand.Intn(2000)                            // retorna um número randômico de 0 a 1999
29		time.Sleep(time.Duration(d) * time.Millisecond) // aguarda um tempo
30	}
31	wg.Wait()                         // aguarda os subprocessos terminarem
32	fmt.Println("Dart Vader leaves.") // imprime na tela
33}

Comunicação entre Processos

 1package main
 2
 3import (
 4	"fmt"
 5	"time"
 6)
 7
 8func child(fc chan string, cc chan string) {
 9	msg := <-cc                                   // aguarda a mensagem do pai
10	fmt.Println("CHILD: Father says " + msg)      // imprime na tela
11	time.Sleep(2 * time.Second)                   // aguarda 2 segundos
12	fmt.Println("CHILD: I will response just ok") // imprime na tela
13	fc <- "ok!"                                   // envia a resposta pelo canal do pai
14}
15
16func main() {
17	fatherChannel := make(chan string)                      // canal de comunicação do pai
18	childCHannel := make(chan string)                       // canal de comunicação do filho
19	go child(fatherChannel, childCHannel)                   // chama a rotina child paralelamente
20	fmt.Println("FATHER: I will say hello to my child")     // imprime na tela
21	msg := "hello"                                          // cria a variável msg e atribui a string hello
22	childCHannel <- msg                                     // envia a mensagem hello pelo canal do filho
23	msg = <-fatherChannel                                   // aguarda a resposta do filho
24	fmt.Println("FATHER: I receive " + msg + " from child") // imprime na tela
25}