为了账号安全,请及时绑定邮箱和手机立即绑定

通过 go 通道流式传输数据

通过 go 通道流式传输数据

Go
精慕HU 2023-04-04 17:04:09
我正在尝试构建一个将通道传递给的函数,当在 go 例程中运行时,它会不断将更新(在本例中为 sin 的值)发布到通道。当数据通过通道发送时,我想通过网络套接字发送它。func sineWave(value chan float64) {    var div float64    sinMult := 6.2839    i := 0    log.Println("started")    for {        div = (float64(i+1) / sinMult)        log.Println(math.Sin(div))        time.Sleep(100 * time.Millisecond)        value <- math.Sin(div)        // log.Println()        i++        if i == 45 {            i = 0        }    }    // log.Println(math.Sin(div * math.Pi))}它似乎卡在value <- main.Sin(div)停止运行 main() 的其余部分。我如何让 sineWave 在后台无限期运行并在它们到达时在另一个函数中打印它的输出?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

这段代码有几个错误,

  • 值 chan 永远不会耗尽,所以任何写入都会阻塞

  • 价值通道永远不会关闭,所以任何流失都是无限的

通道必须始终排空,通道必须在某个时刻关闭。

另外,请发布可重现的示例,否则很难诊断问题。

这是 OP 代码的略微修改但有效的版本。

package main


import (

    "fmt"

    "math"

    "time"

)


func sineWave(value chan float64) {

    defer close(value) // A channel must always be closed by the writer.

    var div float64

    sinMult := 6.2839

    i := 0

    fmt.Println("started")


    for {

        div = (float64(i+1) / sinMult)


        time.Sleep(100 * time.Millisecond)

        value <- math.Sin(div)


        i++

        if i == 4 {

            // i = 0 // commented in order to quit the loop, thus close the channel, thus end the main for loop

            break

        }

    }


}


func main() {

    value := make(chan float64)

    go sineWave(value) // start writing the values in a different routine

    // drain the channel, it will end the loop whe nthe channel is closed

    for v := range value {

        fmt.Println(v)

    }

}


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信