亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go同步和并發模型

Go同步和并發模型

Go
至尊寶的傳說 2023-06-19 16:59:41
我是一名新的 Go 學習者,當我到達&ldquo;關閉頻道&rdquo;部分時,教程會插入此代碼片段(我將刪除原始評論):? ? package main? ? import "fmt"? ? func main() {? ? ? ? jobs := make(chan int, 5)? ? ? ? done := make(chan bool)? ? ? ?go func() {? ? ? ? ? ?for {? ? ? ? ? ? ? ?j, more := <-jobs? ? ? ? ? ? ? ?if more {? ? ? ? ? ? ? ? ? ?fmt.Println("received job", j)? ? ? ? ? ? ? ?} else {? ? ? ? ? ? ? ? ? ?fmt.Println("received all jobs")? ? ? ? ? ? ? ? ? ?done <- true? ? ? ? ? ? ? ? ? ?return? ? ? ? ? ? ? ?}? ? ? ? ? ?}? ? ? ?}()? ? ? ?for j := 1; j <= 18; j++ {? ? ? ? ? ?jobs <- j? ? ? ? ? ?fmt.Println("sent job", j)? ? ? ?}? ? ? ?close(jobs)? ? ? ?fmt.Println("sent all jobs")? ? ? ?<-done? ? }原始代碼在作業發送者循環中設置 3 而不是 18。在play.golang.org中執行這段代碼是我不完全理解的。它總是輸出以下內容:sent job 1sent job 2sent job 3sent job 4sent job 5received job 1received job 2received job 3received job 4received job 5received job 6sent job 6sent job 7sent job 8sent job 9sent job 10sent job 11sent job 12received job 7received job 8received job 9received job 10received job 11received job 12received job 13sent job 13sent job 14sent job 15sent job 16sent job 17sent job 18sent all jobsreceived job 14received job 15received job 16received job 17received job 18received all jobs所以我知道一個頻道的&ldquo;隊列&rdquo;(我知道這個術語不是最準確的,但為了自己學習,這是我對頻道的理解)的大小為 5,所以前 10日志消息對我來說很好。但是消息 6 和 13 如何在實際發送之前輸出它們的接收信息呢?如果通道大小為 5,如何連續發送 7 條消息?我錯過了什么?
查看完整描述

2 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

Goroutines 同時運行,因此它們也同時打印到標準輸出(即無序)。此外,fmt.Print API 是緩沖的,因此您的打印實際上不會在調用時立即打印。這也發生在其他語言中。

這就是為什么您無法從 stdout 中的消息中導出 goroutine 的真正并發執行。


查看完整回答
反對 回復 2023-06-19
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

但是消息 6 和 13 如何在實際發送之前輸出它們的接收信息呢?

我們只知道fmt.Println("received job", j)was printed before fmt.Println("sent job", j)was printed,這在并發工作代碼中是合理的。

如果通道大小為 5,如何連續發送 7 條消息?

同樣,因為我們不確切知道哪個語句首先打印出來,所以這是可以預料的。隊列已經可以減少,我們仍在打印。


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號