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

我应该实施什么:

  1. 一个生成随机 INT 并将它们放在一个通道上并在每次通道推送后暂停 1 秒的 go 例程(我们称之为 A)。

  2. 执行相同操作的第二个 go 例程 (B)。将随机 INT 放入通道 B 并暂停 2 秒。

  3. 现在,我必须从两个通道读取数据,并创建一个 SUM。例如。来自通道 A 的第一个元素与来自通道 B 的第一个元素 - 求和并将其放入通道 C(依此类推 +1),直到创建 100 个和。

  4. 完成 100 个总和后(放入通道 C 并读取)- 关闭通道 A、通道 B 和通道 C。

到目前为止我所拥有的:


千万里不及你
浏览 61回答 1
1回答

慕娘9325324

package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "math/rand"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; a := make(chan int, 10)&nbsp; &nbsp; b := make(chan int, 10)&nbsp; &nbsp; c := make(chan string, 10)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rand.Seed(time.Now().UnixNano())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a <- rand.Intn(101)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Millisecond * 100)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rand.Seed(time.Now().UnixNano())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b <- rand.Intn(101)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Millisecond * 300)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case ai := <-a:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bi := <-b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum := ai + bi&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c <- fmt.Sprintf("%d + %d = %d", ai, bi, sum)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; sums := 0&nbsp; &nbsp; for val := range c {&nbsp; &nbsp; &nbsp; &nbsp; if sums == 10 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(b)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(a)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; println(val)&nbsp; &nbsp; &nbsp; &nbsp; sums++&nbsp; &nbsp; }}出于测试目的,我将秒更改为毫秒,而不是 100 个和,我验证了 10 个,但你明白了。额外信息:通道 A 和通道 B 必须缓冲 100 个项目。同样,出于测试目的,我在这里只放了 10 个。我时不时地收到死锁,我明白为什么。我的问题是,我不明白如何从接收通道关闭两个发送通道。任何人都可以解决这个谜团并向我解释一下。
打开App,查看更多内容
随时随地看视频慕课网APP