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

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

無法讓并發按我的預期工作

無法讓并發按我的預期工作

Go
陪伴而非守候 2022-01-10 14:51:21
我試圖理解為什么我的代碼不起作用,所以我設法在一個更簡單的例子中重現了這個問題。我希望這段代碼輸出字符串“廣播”,但它不輸出任何東西。package mainimport (    "fmt"    "time")type hub struct {    handle    chan []byte    broadcast chan []byte}func (h *hub) init() {    for {        select {        case m := <-h.handle:            handler(m)        case _ = <-h.broadcast:            fmt.Println("broadcasted")        }    }}var socketHub = hub{    handle:    make(chan []byte),    broadcast: make(chan []byte),}func main() {    go socketHub.init()    m := []byte("this is the message")    socketHub.handle <- m    time.Sleep(time.Second * 2)}func handler(m []byte) {    // Do some stuff.    socketHub.broadcast <- m}為什么這不起作用?
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您的broadcast頻道沒有緩沖。這意味著:

  1. 您將消息發送到handle通道:主 goroutine 阻塞,直到...

  2. 在 goroutine 中,selectcase 得到消息...

  3. 并調用(在 goroutine 中)handler,它將消息發送到broadcast通道,阻塞直到......

就是這樣:你的子 goroutine 正在阻塞,等待自己來選擇消息。同時,您的主 goroutine 休眠,然后到達末尾main,退出并終止程序。

您可以通過多種方式“解決”它:

  • 使您的broadcast通道緩沖:這樣,goroutine 發送消息,該消息立即成功,并在for循環中返回,選擇它并按預期打印

  • 使您send的(新)goroutine 在handler中或通過go handler(m)在您的循環中調用

  • 讓兩個不同的 goroutine 監聽handlerbroadcast

你選擇哪一個取決于你試圖解決的確切問題:在這個小例子中,很難找到一個“最好的”。


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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