bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Go無緩沖通道的陷阱是什么

本篇文章為大家展示了Go無緩沖通道的陷阱是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

10余年的定陶網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網絡營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整定陶建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。成都創新互聯公司從事“定陶網站設計”,“定陶網站推廣”以來,每個客戶項目都認真落實執行。

定義

Channel是go的特色之一,甚至說是最大的特色也不為過,使用起來也非常簡單。
首先定義一個int類型的channel:

ch2 := make(chan int) 
ch3 := make(chan int, 10)

我們這里主要關注無緩沖通道。

場景

來看看這段代碼:

package mainimport (
    "sync"
    "fmt")func main() {
    wg := sync.WaitGroup{}

    ch2 := make(chan int)

    wg.Add(1)

    for i := 0; i < 10; i++ {
        ch2 <- i
    }

    go func1(ch2, &wg) 

    wg.Wait()

    close(ch2)
    fmt.Println("Close channel: ", ch2)
}func func1(ch chan int, wg *sync.WaitGroup) {
    FOR:
    for {
        select {
        case i, ok := <- ch:
            if !ok {
                fmt.Println("1 chan closed, returning")
                break FOR
            } else {
                fmt.Println("1 Got number: ", i)
                if i == 9 {
                    break FOR
                }
            }
        default:
            fmt.Println("1 Got nothing")
        }
    }
    wg.Done()
}

乍眼一看似乎沒毛病,但是當運行程序的時候:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /Users/bruce/Code/go/src/GoCommonServices/sync-demo/demo.go:19 +0xb9exit status 2Process finished with exit code 1

為什么呢? 仔細看了看上面的程序,在定義了無緩沖通道ch2之后,立馬向其中寫入數據:

    ch2 := make(chan int)

    for i := 0; i < 10; i++ {
        ch2 <- i
    }

但此時并沒有消費者,而無緩沖通道在寫入一個數據之后,會等待消費者消費,程序阻塞,但啟動消費者的代碼:

    go func1(ch2, &wg)

恰好在for循環之后,所以這個goroutine永遠沒有啟動的機會,這就是報錯信息提示的,deadlock了,要修復這個有兩種方法:

1 ch2定義為緩沖通道,足夠容納for中的數據,就不會阻塞
    ch2 := make(chan int, 10)
2 先啟動消費者,再向通道中寫數據
    go func1(ch2, &wg) 

    ch2 := make(chan int)

    for i := 0; i < 10; i++ {
        ch2 <- i
    }

歸根結底,還是因為channel的特性:

無緩沖的channel,不管是入還是出,都會阻塞,所以在同一個goroutine中,不能同時對同一個無緩沖channel進行入和出操作;
帶緩沖的channel,在隊列滿之前,不會阻塞;隊列滿之后,依然會阻塞。

go是什么

golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。

上述內容就是Go無緩沖通道的陷阱是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。

分享題目:Go無緩沖通道的陷阱是什么
網站網址:http://vcdvsql.cn/article48/pdcohp.html

成都網站建設公司_創新互聯,為您提供手機網站建設、自適應網站、定制網站品牌網站建設、面包屑導航標簽優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司