首頁 > 後端開發 > Golang > 了解 Goroutine

了解 Goroutine

Barbara Streisand
發布: 2024-11-28 05:39:14
原創
322 人瀏覽過

Go 以其簡單且有效率地建立競爭應用程式的能力而脫穎而出。 Goroutines 是實現這一點的功能之一,它是該語言最強大的功能之一。如果您使用過其他語言,您可能熟悉線程,但 Goroutines 不同。

什麼是 Goroutine?

Entendendo Goroutines

簡而言之,它們是與其他函數或方法同時運行的函數或方法。它們比作業系統執行緒更輕,因此您可以以更少的開銷創建數千個 Goroutine。

什麼是線程以及為什麼 Goroutine 可以更輕?

執行緒基本上是進程內的執行單元。一個進程可以有多個線程,所有線程共享相同的記憶體空間,但具有自己的執行堆疊,這基本上是一種儲存有關程式中活動函數的資訊的資料結構。作業系統執行緒由作業系統管理和擴展,每個行程都有數千個執行緒的實際限制和固定的堆疊大小(通常每個執行緒 1MB 或更多)。

Goroutines 是「綠色線程」或使用者級線程,由 Go 運行時管理,動態堆疊大小從 2KB 開始,可以根據需要擴展或減少。這就是為什麼 Goroutines 可以更輕。

什麼是競爭以及與並行有什麼區別?

Entendendo Goroutines

並發是同時處理多個任務的行為,而並行是在多個處理器上同時執行任務。有點令人困惑,但您現在會更好地理解:競爭涉及更多的結構和組織。請參閱下面的範例:

並行涉及更多的執行,實際上是同時運行,請參見下面的範例:

什麼是頻道?

Entendendo Goroutines

通道是 Goroutines 之間的通訊「通道」。它們允許 Goroutines 進行通信並同步其執行。 Goroutines 之間使用 Channel 進行通訊的範例:

func main() {
    ch := make(chan string)

    go func() {
        ch <- "Mensagem da goroutine"
    }()

    msg := <-ch
    fmt.Println(msg)
}
登入後複製

現在讓我們以使用 Goroutine 的範例結束:

// 1. Fazendo café e torrada ao mesmo tempo
func cafeDaManha() {
   fmt.Println("Iniciando café da manhã...") // 1º: Aparece primeiro

   go fazerCafe()    // 2º: "Começando a fazer café..."
   go fazerTorrada() // 3º: "Começando a fazer torrada..."

   // Espera 5 segundos para tudo ficar pronto
   time.Sleep(5 * time.Second)
   fmt.Println("Café da manhã pronto!") // Último: Aparece depois de 5 segundos
}

func fazerCafe() {
   fmt.Println("Começando a fazer café...")
   time.Sleep(3 * time.Second) 
   fmt.Println("Café pronto!") // 4º: Aparece após 3 segundos
}

func fazerTorrada() {
   fmt.Println("Começando a fazer torrada...")
   time.Sleep(2 * time.Second)
   fmt.Println("Torrada pronta!") // 5º: Aparece após 2 segundos
}

/* Saída:
Iniciando café da manhã...
Começando a fazer café...
Começando a fazer torrada...
Torrada pronta! (após 2 segundos)
Café pronto! (após 3 segundos)
Café da manhã pronto! (após 5 segundos)
*/

// 2. Contagem com Goroutines
func contagem() {
   go contar("A", 5) // Começa a contar imediatamente
   go contar("B", 5) // Começa a contar imediatamente

   time.Sleep(6 * time.Second)
}

func contar(nome string, até int) {
   for i := 1; i <= até; i++ {
       fmt.Printf("%s: %d\n", nome, i)
       time.Sleep(1 * time.Second)
   }
}

/* Saída (aproximada - as linhas A e B se misturam):
A: 1
B: 1
A: 2
B: 2
A: 3
B: 3
A: 4
B: 4
A: 5
B: 5
*/

// 3. Enviando mensagens simples
func mensagens() {
   canal := make(chan string)

   go func() {
       canal <- "Olá!"      // 1ª mensagem enviada
       canal <- "Tudo bem?" // 2ª mensagem enviada
       canal <- "Tchau!"    // 3ª mensagem enviada
   }()

   fmt.Println(<-canal) // 1º: Imprime "Olá!"
   fmt.Println(<-canal) // 2º: Imprime "Tudo bem?"
   fmt.Println(<-canal) // 3º: Imprime "Tchau!"
}

/* Saída:
Olá!
Tudo bem?
Tchau!
*/
登入後複製

以上是了解 Goroutine的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板