goroutine的意义与实现

goroutine的意义与实现

goroutine存在的意义

goroutine是用于实现GO的并发的,而不是并行。此处的并发指的是一套管理、调度、执行goroutine的过程。

并行的性能更高,可以同时执行多个进程。但是在性能没那么高的服务器上,并发更会被推荐,并发的实现可能效果会优于并行,因为并发是一种同时管理多件事情的一个过程。使用较少的硬件资源实现更多的事情,这也是GO一向所追求的。

goroutine的实现

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分别分配到各个逻辑处理器上。

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()
}

可以看到结果如下

参考

https://gowalker.org/runtime

https://gowalker.org/sync#WaitGroup

posted @ 2019-04-21 13:53  wangha  阅读(500)  评论(0编辑  收藏  举报