goroutine的意义与实现

goroutine的意义与实现

goroutine存在的意义

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

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

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

参考

https://gowalker.org/runtimecode

https://gowalker.org/sync#WaitGroupblog

相关文章
相关标签/搜索