【问题标题】:Cannot get the multiple channel values in go routines无法在 go 例程中获取多个通道值
【发布时间】:2020-04-08 19:09:09
【问题描述】:

我已经编写了 2 个用于 Web 套接字读取和写入消息的 goroutine。例如,

ch := make(chan bool)
folderName := make(chan string)

go func(co *websocket.Conn) {
    m, d, err := co.ReadMessage()
    fmt.Println(m, string(d), err)

    folderName <- string(d)
    ch <- true

    if string(d) == "closed" {
        ch <- true
        co.Close()
    }
}(conn)

这个 goroutine 用于从套接字读取消息并更新通道。

go func(co *websocket.Conn) {
    value := <-ch
    fldr := <-folderName

    fmt.Println(fldr, value)
}(conn)

这个 goroutine 是用来写消息的。但我无法获得 folderName 和 ch 频道值。我不知道如何找到问题。

如果我通过单通道,我可以从通道中获取消息。但我需要在那个 goroutine 中获得 2 个值。

任何人都可以帮助解决这些问题吗?提前致谢。

【问题讨论】:

  • 1.您不能通过ch(即chan string)发送true。请编辑代码。 2.订单事项。您尝试接收的代码必须先接收folderName,因为您首先通过folderName 发送,否则两个gorotine 都会阻塞。 3. 不用多通道,你可以把数据打包成一个结构体,只有一个通道,这样通常可以减少混乱。
  • 如果你能接受这个答案,如果它达到了目的,我也将不胜感激:)

标签: go channel


【解决方案1】:

在您的情况下,由于您从 websocket.Connection 读取一条消息,因此您需要更改从通道读取的顺序,因为您的通道没有缓冲,只要没有消费者,您的写入就会被阻止,反之亦然. 在您的情况下,您在第一个 goroutine 中写入 folderName 通道,然后从另一个通道 ch 读取,因此您的两个 goroutine 都将被阻止。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan bool)
    folderName := make(chan string)

    go func() {
        ch <- true
        folderName <- "Some text"

        .
                .
                .
    }()

    go func() {
        value := <-ch
        fldr := <-folderName

        fmt.Println(fldr, value)
    }()

    time.Sleep(time.Second)
}

Playground example

【讨论】:

  • 嘿,你从来没有点击过if "Some text" == "closed" 块。一旦chfolderName 通道获得它们的值,另一个goroutine 恢复并打印该值。我只是想给你们一些提示。答案的动机肯定是有的;如果我们修改代码以便 if 块可以工作,但又会出现一个问题,我们正在关闭通道 close(folderName) 但在另一个 goroutine 内部我们正在(接收)&lt;-folderName 它,这可能会导致死锁。所以,小心点。
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2016-04-15
  • 2016-01-24
  • 2019-06-29
  • 2013-01-16
相关资源
最近更新 更多