goroutine是用於實現GO的併發的,而不是並行。此處的併發指的是一套管理、調度、執行goroutine的過程。golang
並行的性能更高,能夠同時執行多個進程。可是在性能沒那麼高的服務器上,併發更會被推薦,併發的實現可能效果會優於並行,由於併發是一種同時管理多件事情的一個過程。使用較少的硬件資源實現更多的事情,這也是GO一貫所追求的。c#
go如何實現併發?服務器
下面代碼就是併發的實現每個 go func(){}()
就是一個 goroutine.併發
package main import "sync" import "net/http" import "log" func main() { var wg sync.WaitGroup var urls = []string{ "http://www.golang.org/", "http://www.google.com/", "http://baidu.com/", } for _, url := range urls { wg.Add(1) go func() { var resp *http.Response var err error defer func() { wg.Done() log.Println(resp) }() resp, err = http.Get(url) if err != nil { log.Println(err) } }() } wg.Wait() // 使得主進程等待 }
go 如何實現並行 ?性能
很是簡單,多建立幾個邏輯處理器,調度器會將goroutine分別分配到各個邏輯處理器上。google
package main import "sync" import "log" import "runtime" func main() { runtime.GOMAXPROCS(2) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() for i := 1; i < 100; i++ { log.Println("A", i) } }() go func() { defer wg.Done() for i := 1; i < 100; i++ { log.Println("B", i) } }() wg.Wait() }
能夠看到結果以下url