Golang是一門由Google開發的程式語言,其並發模型主要基於「協程」(goroutine)和「通道」(channel)。在Go語言中,協程是由Go語句(go)啟動的輕量級線程,它們在單獨的堆疊上運行,並且由Go運行時(goroutine)進行調度。協程與傳統的線程相比,更加輕巧靈活,不需要過多的系統資源,能夠輕鬆創建數以千計的協程來處理並發任務。
下面透過具體的程式碼範例來示範執行緒和協程的使用方式以及它們的異同:
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) // 设置CPU核心数为1 var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() for i := 0; i < 10; i++ { fmt.Println("线程1:", i) } }() go func() { defer wg.Done() for i := 0; i < 10; i++ { fmt.Println("线程2:", i) } }() wg.Wait() }
package main import ( "fmt" ) func main() { for i := 0; i < 2; i++ { go func() { for j := 0; j < 10; j++ { fmt.Println("协程:", i, j) } }() } // 等待协程全部执行完成 time.Sleep(time.Second) }
透過上述程式碼範例,我們可以看到執行緒和協程的使用方式。在執行緒範例中,我們使用了sync.WaitGroup
來等待兩個執行緒的執行結束;而在協程範例中,我們透過go func()
的方式啟動了兩個協程,並透過time.Sleep()
來等待協程的執行。
總的來說,執行緒與協程在Go語言中的異同主要體現在調度方式、資源消耗和通訊機制。對於開發者來說,在不同的場景下選擇合適的並發模型,可以更好地實現程式的並發處理和提升效能表現。
以上是深入解析Golang中執行緒與協程的異同的詳細內容。更多資訊請關注PHP中文網其他相關文章!