簡體   English   中英

基本的Golang流(通道)死鎖

[英]A basic Golang stream(channel) deadlock

我正在嘗試使用go stream,但有幾個“愚蠢”的問題。

我已經用字節限制范圍做了一個原始的流示例,這是工作代碼,這是我的問題。

1-為什么此代碼在新行顯示1和2? 為什么它沒有一次顯示12? 是否從字節限制的流中刪除了字節的第一和平? (但是,當我們已經將1數字推入時,如何將2數字推入流中?)我只是不明白

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}
It shows:
1
2

2個問題-我嘗試使用此代碼來了解其工作原理,並且刪除了字節范圍,並遇到了死鎖錯誤。 為什么會發生? 謝謝!

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /tmp/sandbox557775903/main.go:7 +0x60

死鎖錯誤代碼:

package main

import "fmt"

func main() {
    ch := make(chan int)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

謝謝你的幫助! 對不起原始問題。

因為通道運算符<-僅占用通道中的1個元素。 如果希望它們一起打印,請嘗試: fmt.Println("%v%v", <-c, <-c)"

通道創建中的最后一個數字make(chan int, 2)表示通道緩沖區-它存儲項目的能力。 因此,您可以輕松地將2個項目推送到頻道。 但是,如果您嘗試再推一件商品,會發生什么? 該操作將被阻止,因為在從通道讀取另一個goroutine並釋放空間之前,沒有空間。

同樣適用於所有通道-未緩沖的通道會在首次寫入元素時被阻塞。 直到從該通道讀取某些goroutine。

因為沒有要讀取的goroutine,所以要永遠寫一個鎖。 您可以在開始閱讀goroutine之前解決該問題。

 c := make(chan int)
go func () {
    fmt.Println(<-c)
    fmt.Println(<-c)
}()
ch <- 1
ch <- 2

這種方式不會被鎖定,而是開始傳輸項目。

1-為什么此代碼在新行顯示1和2?

答:因為您使用Println()方法。 如果您希望將它們放在一行上,請使用Print()

2我嘗試使用此代碼來了解其工作原理,並且刪除了字節字數,並出現了死鎖錯誤。 為什么會發生?

就代碼所示而言,您永遠不會為您創建的頻道啟動並發閱讀器。 因為它是無緩沖的,所以對它的任何寫操作都將阻塞,直到有人從另一端讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM