• 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

  • 相关阅读:
    THUSC2019游记
    2019-8-2-WPF-从文件加载字体
    2019-8-2-WPF-从文件加载字体
    2018-8-10-VisualStudio-合并代码文件
    2018-8-10-VisualStudio-合并代码文件
    2018-8-10-UWP-分享用那个图标
    2018-8-10-UWP-分享用那个图标
    2018-8-10-WPF-可获得焦点属性
    2018-8-10-WPF-可获得焦点属性
    2018-8-10-WPF-好看的矢量图标
  • 原文地址:https://www.cnblogs.com/wangha/p/10744951.html
Copyright © 2020-2023  润新知