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