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

我如何等到接收器通道完成它在 golang 中的执行?

我如何等到接收器通道完成它在 golang 中的执行?

Go
Smart猫小萌 2022-06-06 15:16:18
我有这个示例代码,我正面临这个同步问题,任何人都可以帮助我如何实现这一点。package mainimport "fmt"func main() {baseChan := make(chan int)go func(bCh chan int){for {select{    case stats, _ := <- bCh:    fmt.Println("base stats", stats)}}}(baseChan)second := make(chan int)go func (sCh chan int) {fmt.Println("second channel")for {select {case stats, _ := <- sCh:    fmt.Println("seconds stats", stats)    baseChan <- stats}}}(second)runLoop(second)}func runLoop(second chan int) { for i := 0; i < 5; i++ {fmt.Println("writing i", i)    second <- i}}实际输出:writing i 0second channelseconds stats 0base stats 0writing i 1writing i 2seconds stats 1seconds stats 2我希望输出是这样的,writing i 0seconds stats 0base stats 0writing i 1seconds stats 1base stats 1writing i 2seconds stats 2base stats 2
查看完整描述

2 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以编写 goroutine 以便它们相互等待。例如,这是一个位于生产者和消费者之间的中级传输器函数,并迫使他们缓慢前进:


func middle(in, out chan int, inAck, outAck chan struct{}) {

    defer close(out)

    for value := range in {

        fmt.Println("middle got", value)

        out <- value // send

        fmt.Println("middle now waiting for ack from final")

        <-outAck            // wait for our consumer

        inAck <- struct{}{} // allow our producer to continue

    }

}

但总而言之,这是愚蠢的。强制生产者等到消费者完成并使用通道是没有意义的,因为如果我们想让生产者等待,我们只需编写:


for ... {

    produced_value = producerStep()

    final(middle(produced_value))

}

whereproducerStep()产生下一个值,完全省去通道。


查看完整回答
反对 回复 2022-06-06
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

代码按预期工作。runLoop()但是你可以做一件事,在函数的两个连续步骤之间放置一定的间隔。但是不建议设置固定的时间间隔,您需要编写一些代码来确保完成这些工作。只是展示这个例子,向你展示这里发生了什么。


func runLoop(second chan int) {

    for i := 0; i < 5; i++ {

        fmt.Println("writing i", i)

        second <- i

        time.Sleep(100 * time.Millisecond) // <-- here

    }

}

这里发生了什么?只需给予足够的时间来完成在单独的 goroutine 中运行的作业。


输出:


writing i 0

seconds stats 0

base stats 0


writing i 1

seconds stats 1

base stats 1


writing i 2

seconds stats 2

base stats 2


writing i 3

seconds stats 3

base stats 3


writing i 4

seconds stats 4

base stats 4


查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号