[英]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.