相关疑难解决方法(0)

多个goroutines在一个频道上收听

我有多个goroutines尝试同时在同一个频道上接收.似乎在频道上开始接收的最后一个goroutine获得了价值.这是语言规范中的某个地方还是未定义的行为?

c := make(chan string)
for i := 0; i < 5; i++ {
    go func(i int) {
        <-c
        c <- fmt.Sprintf("goroutine %d", i)
    }(i)
}
c <- "hi"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)

输出:

goroutine 4
Run Code Online (Sandbox Code Playgroud)

在操场上的示例

编辑:

我才意识到这比我想象的要复杂得多.消息在所有goroutine周围传递.

c := make(chan string)
for i := 0; i < 5; i++ {
    go func(i int) {
        msg := <-c
        c <- fmt.Sprintf("%s, hi from %d", msg, i)
    }(i)
}
c <- "original"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)

输出:

original, hi from 0, hi from 1, hi from …
Run Code Online (Sandbox Code Playgroud)

go

65
推荐指数
4
解决办法
5万
查看次数

Go:一个有多个听众的频道

如果话题有问题,我很抱歉去,所以我很抱歉,但我希望你理解我的问题.我想通过频道将事件处理到不同的例行程序.这是一些示例代码

type Event struct {
    Host string
    Command string
    Output string
}


var (
    incoming        = make(chan Event)
)

func processEmail(ticker* time.Ticker) {
    for {
        select {
        case t := <-ticker.C:
            fmt.Println("Email Tick at", t)
        case e := <-incoming:
            fmt.Println("EMAIL GOT AN EVENT!")
            fmt.Println(e)
        }
    }
}

func processPagerDuty(ticker* time.Ticker) {
    for {
        select {
        case t := <-ticker.C:
            fmt.Println("Pagerduty Tick at", t)
        case e := <-incoming:
            fmt.Println("PAGERDUTY GOT AN EVENT!")
            fmt.Println(e)
        }
    }
}

func main() {

    err := …
Run Code Online (Sandbox Code Playgroud)

go

10
推荐指数
2
解决办法
4936
查看次数

单个通道上的多个接收器.谁得到了数据?

无缓冲通道阻塞接收器,直到通道上的数据可用.我不清楚这种阻塞如何在同一通道上使用多个接收器(比如使用goroutines时).只要没有在该频道上发送数据,我相信他们都会阻止.
但是,一旦我向该频道发送单个值,会发生什么?哪个接收器/ goroutine将获取数据并因此解除阻塞?他们都是?排在第一位?随机?

channel go blocking

10
推荐指数
2
解决办法
5395
查看次数

如何从多个 goroutine 共享的单个通道中读取数据

我有几个 goroutine 写入同一个通道。如果我使用缓冲通道,我可以检索输入。但是,如果使用无缓冲通道,我只能读取大约一半的值:

func testAsyncFunc2() {

    ch := make(chan int,10)

    fmt.Println("testAsyncFunc2")
    wg.Add(10)
    for  i :=0; i < 10; i++  {
        go sender3(ch, i)
        wg.Done()
    }

    receiver3(ch)

    close(ch)
    wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)

这是接收器函数:

func receiver3(ch chan int) {
    for {
        select {
        case <-ch:
            fmt.Println(<-ch)
        default:
            fmt.Println("Done...")
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发送功能:

func sender3(ch chan int, i int) {
    ch <- i
}
Run Code Online (Sandbox Code Playgroud)

和输出:

testAsyncFunc 2 0 4 6 8 2 完成...

虽然我希望能拿回 10 个号码。

go

5
推荐指数
1
解决办法
3130
查看次数

标签 统计

go ×4

blocking ×1

channel ×1