码迷,mamicode.com
首页 > 其他好文 > 详细

goroutine的意义与实现

时间:2019-04-21 14:36:38      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:url   wait   UNC   out   www.   int   import   inf   log   

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

goroutine的意义与实现

标签:url   wait   UNC   out   www.   int   import   inf   log   

原文地址:https://www.cnblogs.com/wangha/p/10744951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!