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

并发问题 - 在两个通道上发送 INT 流 - 从一个通道读取

并发问题 - 在两个通道上发送 INT 流 - 从一个通道读取

Go
千万里不及你 2023-01-03 13:51:55
我应该实施什么:一个生成随机 INT 并将它们放在一个通道上并在每次通道推送后暂停 1 秒的 go 例程(我们称之为 A)。执行相同操作的第二个 go 例程 (B)。将随机 INT 放入通道 B 并暂停 2 秒。现在,我必须从两个通道读取数据,并创建一个 SUM。例如。来自通道 A 的第一个元素与来自通道 B 的第一个元素 - 求和并将其放入通道 C(依此类推 +1),直到创建 100 个和。完成 100 个总和后(放入通道 C 并读取)- 关闭通道 A、通道 B 和通道 C。到目前为止我所拥有的:
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

package main


import (

    "fmt"

    "math/rand"

    "time"

)


func main() {


    a := make(chan int, 10)

    b := make(chan int, 10)

    c := make(chan string, 10)


    go func() {

        for {

            rand.Seed(time.Now().UnixNano())

            a <- rand.Intn(101)

            time.Sleep(time.Millisecond * 100)

        }

    }()


    go func() {

        for {

            rand.Seed(time.Now().UnixNano())

            b <- rand.Intn(101)

            time.Sleep(time.Millisecond * 300)

        }

    }()


    go func() {

        for {

            select {

            case ai := <-a:

                bi := <-b

                sum := ai + bi

                c <- fmt.Sprintf("%d + %d = %d", ai, bi, sum)


            }

        }

    }()


    sums := 0

    for val := range c {

        if sums == 10 {

            close(c)

            close(b)

            close(a)

        }

        println(val)

        sums++

    }


}


出于测试目的,我将秒更改为毫秒,而不是 100 个和,我验证了 10 个,但你明白了。


额外信息:通道 A 和通道 B 必须缓冲 100 个项目。同样,出于测试目的,我在这里只放了 10 个。


我时不时地收到死锁,我明白为什么。我的问题是,我不明白如何从接收通道关闭两个发送通道。任何人都可以解决这个谜团并向我解释一下。


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

添加回答

举报

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