#
Goroutines
Vamos continuar a nossa jornada com as goroutines. Quero fazer mais um exemplo aqui.
package main
import (
"fmt"
"time"
)
func task(name string, n int) {
for i := 0; i < n; i++ {
fmt.Printf("Task: %s, i:%d/%d\n", name, i, n)
time.Sleep(500 * time.Millisecond)
}
}
func main() {
go task("1", 5)
go task("2", 7)
time.Sleep(10 * time.Second)
}
Veja a saída desse programa:
Task: 2, i:0/7
Task: 1, i:0/5
Task: 1, i:1/5
Task: 2, i:1/7
Task: 2, i:2/7
Task: 1, i:2/5
Task: 1, i:3/5
Task: 2, i:3/7
Task: 2, i:4/7
Task: 1, i:4/5
Task: 2, i:5/7
Task: 2, i:6/7
Talvez esse exemplo seja mais elucidativo do que o anterior. Nele podemos ver claramente as duas goroutines rodando. O mais legal disso tudo foi a simplicidade de criar uma goroutine. No python, por exemplo, você teria que usar o threading
ou multiprocessing
para fazer isso. Perceba que o time.Sleep(10 * time.Second)
é só um recursso técnico não convencional gambiarra. Uma das formas de resolver isso é um WaitGroup.