使用頻道時,goroutine 的執行順序是什麼?
php小編百草在這裡給大家解答一個常見的問題:「使用通道時,goroutine 的執行順序是什麼?」在Go語言中,goroutine是輕量級的線程,可以並發執行。當使用通道來進行協程間的通訊時,通道的接收和發送操作是阻塞的,即它們會等待其他協程的操作完成。因此,當有多個goroutine同時操作一個通道時,它們的執行順序是不確定的,取決於各個協程的調度。這意味著,無法確定哪個goroutine會先執行,哪個會後執行,這由Go語言的調度器決定。
問題內容
使用通道時 goroutine 的執行順序是什麼?我認為寫入或讀取通道會停止目前的 goroutine。但我的測試程式碼不遵循此規則:
func main() { ch := make(chan int) go sum(ch, 3) fmt.Println("Write number: 10") ch <- 10 fmt.Println("Write number: 20") ch <- 20 fmt.Println("Write number: 30") ch <- 30 fmt.Println("Finish main") } func sum(ch chan int, len int) { fmt.Println("Func 'sum' start") sum := 0 for i := 0; i < len; i++ { fmt.Println("For start") num := <-ch fmt.Printf("Read from ch: %d\n", num) sum += num fmt.Println("For finish") } fmt.Printf("Sum: %d\n", sum) }
我認為這個程式如何運作:
1.建立頻道
2.建立一個goroutine(不啟動,只初始化)
3.列印:寫下數字:10
4.錄製至10頻道。鎖定主要功能。
5.最主要的是被擋住了。啟動 sum goroutine。
6.列印求和函數:Func 'sum' start
7.求和函數循環運行並列印:“To begin”
8.從「ch」讀取數字 10 並列印:「Read from ch: 10」
9.下一步。列印:“完成”並繼續下一次迭代。
10。列印:“開始於”並嘗試寫“with”。但通道是空的。停額,進入主線
...一次又一次。
然後我想看看:
Write number: 10 Func 'sum' start For start Read from ch: 10 For finish For start Write number: 20 Read from ch: 20 For finish For start Write number: 30 Read from ch: 30 For finish Sum: 60 Finish main
但是,我看到:
Write number: 10 Func 'sum' start For start Read from ch: 10 For finish For start Write number: 20 Write number: 30 Read from ch: 20 For finish For start Read from ch: 30 For finish Sum: 60 Finish main
這怎麼可能?主函數向通道寫入兩次而不讀取。
另外,如果您更改 for 中的呼叫次數:
go sum(ch, 2)
我不會收到錯誤。但沒有人閱讀最後一則訊息
範例:在此訊息之前。
解決方法
Goroutines 並發運行。在具有多個核心的系統上,它們可以並行運行。詳細資訊取決於 Go 運行時中的調度程序實作。出於所有意圖和目的,除了通道通訊等同步操作之外,事情都以隨機順序發生。
事實並非如此,也不是正在發生的事情(只要通道沒有緩衝)。 Println 呼叫發生在傳送操作之前,主 Goroutine 在列印後阻塞,直到 sum Goroutine 準備好接收。
是否看到「Read from ch: 30」印出來也是隨機的。對應的接收操作必須發生,因為 main 會被阻塞,直到它發生為止。然而,main 可能會在接收發生後在 Println 之前返回,並且當 main 返回時程式會立即終止,無論是否存在任何其他 goroutine。如果通道被緩衝,發生這種情況的可能性就會增加。
事實並非如此。如果只有兩個接收總是導致死鎖: https://go.dev/play/p/ qFVh529mkqR
以上是使用頻道時,goroutine 的執行順序是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...
