gpt4 book ai didi

go - 无法像我预期的那样使并发工作

转载 作者:IT王子 更新时间:2023-10-29 02:25:55 27 4
gpt4 key购买 nike

我试图理解为什么我的代码不起作用,所以我设法在一个更简单的示例中重现了这个问题。

我希望这段代码输出字符串“broadcasted”,但它没有输出任何内容。

package main

import (
"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
}

为什么这不起作用?

最佳答案

您的广播 channel 无缓冲。这意味着:

  1. 您将消息发送到 handle channel :主 goroutine block 直到...
  2. 在 goroutine 中,select case 获取消息...
  3. 并调用(在 goroutine 中)handler,它将消息发送到 broadcast channel ,阻塞直到...

就是这样:您的子 goroutine 正在阻塞,等待自己选择消息。同时,您的 main goroutine 休眠,然后到达 main 的末尾,退出并终止程序。

您可以通过多种方式“解决”它:

  • 让你的broadcast channel 缓冲:这样,goroutine 发送消息,立即成功,并在for 循环中返回,选择它并按预期打印
  • handler 中,或者通过在循环中调用 go handler(m),让你的 send 成为一个(新的)goroutine<
  • 让两个不同的 goroutine 监听 handlerbroadcast

您选择哪一个取决于您尝试解决的确切问题:在这个小示例中,很难找到“最佳”的。

关于go - 无法像我预期的那样使并发工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com