Multithreading no Go

Definição

Green thread

É a thread gerenciada pelo Go (go routines).

A declaração dessa thread (paralela a thread principal) é feita a partir da palavra reservada go.

Channel

É o termo dado para a conexão entre threads.

Exemplo

package main
 
import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
)
 
func main() {
    requestId := make(chan int)
    concurrency := 2 // 2 workers
 
    for i := 0; i <= concurrency; i++ {
        go worker(requestId, 1) // go => geração de um nova thread (paralelo a thread principal)
    }
 
    for i := 0; i < 10; i++ {
        requestId <- i // atribuindo um valor a um channel
    }
}
 
func worker(requestId chan int, worker int) {
    for r := range requestId {
        res, err := http.Get("http://localhost:8585/product")
 
        if err != nil {
            log.Fatal("Erro")
        }
 
        defer res.Body.Close()
 
        content, _ := ioutil.ReadAll(res.Body)
        fmt.Printf("Worker %d. RequestId: %d Content: %s", worker, r, string(content))
        time.Sleep(time.Second * 2)
    }
}