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

相關文章
相關標籤/搜索