goroutine的意义与实现

Posted wangha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于goroutine的意义与实现的主要内容,如果未能解决你的问题,请参考以下文章

goroutine简介

一个片段的活动有啥意义吗?

goroutine与channels

golang的goroutine与channel

Go中的特殊协程g0

一文初探 Goroutine 与 channel