go 協程(Goroutine)

Go 協程是什麼?

Go 協程是與其餘函數或方法一塊兒併發運行的函數或方法。Go 協程能夠看做是輕量級線程。與線程相比,建立一個 Go 協程的成本很小。所以在 Go 應用中,經常會看到有數以千計的 Go 協程併發地運行。程序員

Go 協程相比於線程的優點

  • 相比線程而言,Go 協程的成本極低。堆棧大小隻有若干 kb,而且能夠根據應用的需求進行增減。而線程必須指定堆棧的大小,其堆棧是固定不變的。
  • Go 協程會複用(Multiplex)數量更少的 OS 線程。即便程序有數以千計的 Go 協程,也可能只有一個線程。若是該線程中的某一 Go 協程發生了阻塞(好比說等待用戶輸入),那麼系統會再建立一個 OS 線程,並把其他 Go 協程都移動到這個新的 OS 線程。全部這一切都在運行時進行,做爲程序員,咱們沒有直接面臨這些複雜的細節,而是有一個簡潔的 API 來處理併發。
  • Go 協程使用信道(Channel)來進行通訊。信道用於防止多個協程訪問共享內存時發生競態條件(Race Condition)。信道能夠看做是 Go 協程之間通訊的管道。咱們會在下一教程詳細討論信道。

如何啓動一個 Go 協程?

調用函數或者方法時,在前面加上關鍵字 go,可讓一個新的 Go 協程併發地運行。併發

讓咱們建立一個 Go 協程吧。函數

package main

import (
    "fmt"
)

func hello() {
    fmt.Println("Hello world goroutine")
}
func main() {
    go hello()
    //啓動一個協程,協程的調用會當即返回,程序會繼續執行下一行,由於主協程結束,程序終止,其餘的協程也會終止
   //time.Sleep(1 * time.Second)  因此咱們須要加這行代碼才能體現併發
    fmt.Println("main function")
}

這就是協程,寫起來很是的簡便!spa

相關文章
相關標籤/搜索