亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Golang極簡入門教程(三):并發支持

2020-04-01 19:25:56
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Golang極簡入門教程(三):并發支持,本文講解了goroutine線程、channel 操作符等內容,需要的朋友可以參考下
 

Golang 運行時(runtime)管理了一種輕量級線程,被叫做 goroutine。創建數十萬級的 goroutine 是沒有問題的。范例:

 

復制代碼代碼如下:

package main
 
import (
    "fmt"
    "time"
)
 
func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}
 
func main() {
    // 開啟一個 goroutine 執行 say 函數
    go say("world")
    say("hello")
}

 

我們使用 channel 和 goroutine 通訊。channel 中是一種帶有類型的通道,被用于接收和發送特定類型的值。操作符 <- 被叫做 channel 操作符(這個操作符中箭頭表明了值的流向):

 

復制代碼代碼如下:

// 發送 v 到 channel ch
ch <- v
// 接收 channel ch 中的值并賦值給 v
v := <-ch

 

使用 channel 和 goroutine 通訊能夠避免顯式使用鎖機制,通過 channel 發送和接收值時默認是阻塞的。

通過 make 函數創建 channel:

 

復制代碼代碼如下:

// int 指定 channel 收發值的類型為 int
ch := make(chan int)

 

一個完整的例子:

 

復制代碼代碼如下:

package main
 
import "fmt"
 
// 計算數組 a 中所有元素值之和
func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    // 計算結果發送到 channel c
    c <- sum
}
 
func main() {
    a := []int{7, 2, 8, -9, 4, 0}
 
    // 創建 channel c
    c := make(chan int)
 
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
 
    // 接收兩個 goroutine 發送的計算結果
    x, y := <-c, <-c
 
    fmt.Println(x, y, x+y)
}package main
 
import "fmt"
 
// 計算數組 a 中所有元素值之和
func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    // 計算結果發送到 channel c
    c <- sum
}
 
func main() {
    a := []int{7, 2, 8, -9, 4, 0}
 
    // 創建 channel c
    c := make(chan int)
 
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
 
    // 接收兩個 goroutine 發送的計算結果
    x, y := <-c, <-c
 
    fmt.Println(x, y, x+y)
}

 

channel 可以帶有一個緩沖區(buffer)來緩存被傳遞的值,向 channel 中發送時只有緩沖區滿的情況下會阻塞,接收 channel 中的值時只有在緩沖區空的情況下阻塞:

 

復制代碼代碼如下:

package main
 
import "fmt"
 
func main() {
    // 創建 channel,緩沖區長度為 2
    c := make(chan int, 2)
    // 由于 channel 的緩沖區長度為 2
    // 因此發送不會阻塞
    c <- 1
    c <- 2
    fmt.Println(<-c)
    fmt.Println(<-c)
}

 

發送者可以調用 close 來關閉 channel,接收者可以檢測到 channel 是否被關閉:

 

復制代碼代碼如下:

// 這里的 ok 為 false 表示已經沒有值可以接收了,并且 channel 被關閉了
v, ok := <-ch

 

不要向已經關閉的 channel 發送值了(will cause a panic)。

我們可以使用 for range 來接收 channel 中的值:

 

復制代碼代碼如下:

package main
 
import "fmt"
 
func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        c <- x
        x, y = y, x+y
    }
    // 必須要關閉 c
    close(c)
}
 
func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)
    // 這里 for 和 range 組合使用
    // 不斷的接收 c 中的值一直到它被關閉
    for i := range c {
        fmt.Println(i)
    }
}

 

通常來說,我們不需要主動的關閉 channel。但有時候接收者必須被告知已經沒有值可以接收了,這時候主動關閉是必要的,例如終止 for range 循環。

使用 select 語句可以讓一個 goroutine 等待多個通訊操作。select 會阻塞直到某個 case 能夠運行,如果同時存在多個可執行的,那么將隨機選擇一個:

 

復制代碼代碼如下:

package main
 
import "fmt"
 
func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        // 控制此線程退出
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}
 
func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

 

select 中的 default 會在沒有任何 case 可執行時執行(類似于 switch):

 

復制代碼代碼如下:

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    // 創建一個 tick channel
    // 在 100 毫秒后會向 tick channel 中發送當前時間
    tick := time.Tick(100 * time.Millisecond)
    // 創建一個 boom channel
    // 在 500 毫秒后會向 boom channel 中發送當前時間
    boom := time.After(500 * time.Millisecond)
    for {
        select {
        case <-tick:
            fmt.Println("tick.")
        case <-boom:
            fmt.Println("BOOM!")
            return
        default:
            fmt.Println("    .")
            time.Sleep(50 * time.Millisecond)
        }
    }
}
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情综合网| 亚洲国产成人久久综合| 日韩美女免费观看| 成人免费黄色网| 国产欧美一区二区| 色多多国产成人永久免费网站| 欧美在线免费观看| 日韩在线视频国产| 国产综合色香蕉精品| 国内精品免费午夜毛片| 亚洲精品福利在线| 国产亚洲成av人片在线观看桃| 亚洲xxxx视频| 日韩av网站大全| 欧美猛交ⅹxxx乱大交视频| 久久精品国产久精国产一老狼| 国产91精品最新在线播放| 国产综合视频在线观看| 欧美中文字幕在线视频| 国产成一区二区| 日韩网站在线观看| 国产91对白在线播放| 日韩av在线影视| 成人福利网站在线观看11| 久久久久久综合网天天| 黄色一区二区三区| 精品少妇一区二区30p| 国产精品爱啪在线线免费观看| 国产69精品久久久久99| 国产精品18久久久久久首页狼| 国产精品第一视频| 成人黄色片网站| 亚洲精品不卡在线| 日本成人黄色片| 97国产成人精品视频| 国产ts一区二区| 欧美成人午夜免费视在线看片| 色播久久人人爽人人爽人人片视av| 成人免费看吃奶视频网站| 尤物九九久久国产精品的特点| 成人中文字幕在线观看| 中文字幕国内精品| 亚洲夜晚福利在线观看| 亚洲娇小xxxx欧美娇小| 亚洲人成在线电影| 国产成人avxxxxx在线看| 欧美一区二区大胆人体摄影专业网站| 国内精品国产三级国产在线专| 欧美精品videosex性欧美| 亚洲视频电影图片偷拍一区| 中文字幕亚洲欧美日韩高清| 7777kkkk成人观看| 日韩在线观看网址| www.欧美三级电影.com| 97欧美精品一区二区三区| 日本高清不卡在线| 亚洲国产99精品国自产| 久久久最新网址| 黄色一区二区在线观看| 日韩中文字幕不卡视频| 91高潮精品免费porn| 国产亚洲欧洲黄色| 日韩欧美国产网站| 欧美精品videosex牲欧美| 国产精品最新在线观看| 97视频在线观看视频免费视频| 国产精品91在线观看| 亚洲精品国产综合久久| 国外日韩电影在线观看| 亚洲视频国产视频| 久久久久国产精品一区| 色噜噜久久综合伊人一本| 国产欧美精品久久久| 久久久久久久久久国产精品| 欧美午夜片欧美片在线观看| 日韩高清免费在线| 国产91精品青草社区| 精品国模在线视频| 久久久久久久久久久网站| 欧美日韩国产区| 亚洲a中文字幕| 在线一区二区日韩| 久久99精品久久久久久青青91| 国产精品入口免费视| 精品亚洲aⅴ在线观看| 国产亚洲精品日韩| 日本91av在线播放| 亚洲成人激情在线观看| 一区二区欧美在线| 91爱爱小视频k| 欧美黑人国产人伦爽爽爽| 欧美日韩另类字幕中文| 欧美俄罗斯性视频| 91丝袜美腿美女视频网站| 久久久久久久久国产| 成人精品福利视频| 日韩欧美高清视频| 成人综合网网址| 97人洗澡人人免费公开视频碰碰碰| 欧美日韩亚洲成人| 色视频www在线播放国产成人| 91精品国产99久久久久久| 久久伊人精品天天| 欧美精品999| 亚洲片av在线| 亚洲精品免费av| 欧美激情亚洲精品| 国产日韩欧美91| 亚洲人成毛片在线播放| 成人乱人伦精品视频在线观看| 国产亚洲精品综合一区91| 成人午夜一级二级三级| 在线观看中文字幕亚洲| 欧美亚洲日本网站| 国产精品久久久久久久久久久不卡| 这里只有精品丝袜| 欧美最猛性xxxxx亚洲精品| 国产精品偷伦免费视频观看的| 国产亚洲欧美一区| 色婷婷综合久久久久中文字幕1| 中文日韩电影网站| 欧美激情小视频| 最近2019中文免费高清视频观看www99| 国产精品高清网站| 日韩精品欧美国产精品忘忧草| 亚洲无av在线中文字幕| 国产欧美日韩中文字幕| 九九九热精品免费视频观看网站| 国产日韩精品入口| **欧美日韩vr在线| 欧美俄罗斯乱妇| 热久久视久久精品18亚洲精品| 亚洲国产精品久久久久久| 亚洲最新视频在线| 亚洲视频日韩精品| 国产精品偷伦视频免费观看国产| 日韩av资源在线播放| 日韩成人小视频| 成人国产在线视频| 日韩精品在线免费观看视频| 久久久在线观看| 91香蕉电影院| 国产日韩视频在线观看| 欧美自拍大量在线观看| 欧美一级视频免费在线观看| 自拍偷拍亚洲欧美| 中文字幕久久久av一区| 亚洲国产精彩中文乱码av| 国产精品视频公开费视频| y97精品国产97久久久久久| 91亚洲国产成人久久精品网站| 亚洲欧美国产精品| 日韩欧美在线免费| 国产精品流白浆视频| 91精品视频大全| 久久免费高清视频| 中文字幕v亚洲ⅴv天堂| 国产精品激情av电影在线观看| 亚洲人成电影网站色www| 亚洲va欧美va国产综合久久| 亚洲精品成a人在线观看| 国产亚洲欧洲高清| 亚洲天堂av在线播放| 亚洲精品女av网站|