go routine 允許 go 函數并發執行,無需阻塞,且共享同一內存空間。這影響了函數的行為,使其可以:并發執行,同時運行各個任務。非阻塞,不會等待其他函數完成。共享內存,可以訪問并修改全局變量。
Go Routine 如何影響 Go 函數的行為
Go routine 是 Go 語言中的并發機制之一,它允許程序員并發執行多個任務。這使得程序可以更高效地利用計算機的多個內核。
如何創建 Go Routine
要創建 Go routine,您可以使用 go 關鍵字。例如,以下代碼創建一個新的 Go routine,它將對 channel 打印消息:
package main
import "fmt"
func main() {
// 創建一個 channel
ch := make(chan string)
// 創建一個 Go routine 并將其作為一個新線程執行
go func() {
ch <- "Hello World!"
}()
// 從 channel 讀取消息
msg := <-ch
fmt.Println(msg)
}
登錄后復制
Go Routine 對函數行為的影響
Go routine 會對函數的行為產生以下影響:
并發執行:Go routine 允許函數并發執行,這意味著它們可以同時運行。非阻塞:Go routine 是非阻塞的,這意味著它們不會等待其他函數完成。共享內存:Go routine 共享同一內存空間,因此它們可以訪問并修改全局變量。
實戰案例
以下是一個展示 Go routine 如何影響函數行為的實戰案例:
package main
import (
"fmt"
"sync/atomic"
"runtime"
)
var counter uint64
func main() {
// 創建 100 個 Go routine
for i := 0; i < 100; i++ {
go func() {
atomic.AddUint64(&counter, 1)
}()
}
// 等待所有 Go routine 完成
runtime.Gosched()
fmt.Println("Counter:", counter)
}
登錄后復制
在這個例子中,我們創建了 100 個 Go routine,每個 Go routine 都對一個全局變量 counter 進行遞增。由于 Go routine 是并發執行的,因此它們可以同時對 counter 進行遞增,這可能會導致數據競爭問題。
為了解決這個問題,我們使用了 sync/atomic 包中的 AddUint64 函數,它是一個原子操作,保證在并發情況下安全地更新 counter 值。






