猿问

并发执行但序列化输出

我需要使用 3 个名为g1g2g3. 并以循环方式在上述 3 个 goroutine 中分配 1-10 的数字。他们将根据提供的数字做一些假设性的工作。程序应按以下方式打印输出。

g1-1
g2-2
g3-3
g1-4
g2-5
g3-6
...

任务必须同时执行,但输出必须按顺序排列。

我已经实现了下面的代码,它分配数字和打印,但如上所述不能保证输出打印顺序。

我需要一些帮助来修复以下代码或关于另一种方法的建议以获得上述所需的输出。

方法一:

package main


import (

    "fmt"

    "sync"

)


func main() {


    chang1 := make(chan int)

    chang2 := make(chan int)

    chang3 := make(chan int)


    var wg sync.WaitGroup

    wg.Add(3)


    go func() {

        for num := range chang1 {

            fmt.Println("g1", num)

        }

        wg.Done()

    }()


    go func() {

        for num := range chang2 {

            fmt.Println("g2", num)

        }

        wg.Done()


    }()


    go func() {

        for num := range chang3 {

            fmt.Println("g3", num)

        }

        wg.Done()


    }()


    channels := []chan int{chang1, chang2, chang3}


    for i := 1; i <= 10; i++ {


        currentCh := (i - 1) % 3

        channels[currentCh] <- i


    }


    close(chang1)

    close(chang2)

    close(chang3)

    wg.Wait()


}

输出(顺序不正确)


g1- 1

g1- 4

g2- 2

g3- 3

g1- 7

g2- 5

g2- 8

g3- 6

g3- 9

g1- 10

...


缥缈止盈
浏览 114回答 1
1回答

侃侃无极

如果您不想使用 slice ,那么我认为这样的事情会起作用:-(操场)package mainimport (&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; chang1 := make(chan string)&nbsp; &nbsp; chang2 := make(chan string)&nbsp; &nbsp; chang3 := make(chan string)&nbsp; &nbsp; channels := []chan string{chang1, chang2, chang3}&nbsp; &nbsp; for i := 1; i < 10; i += 3 {&nbsp; &nbsp; &nbsp; &nbsp; go g1(i, channels[i%3])&nbsp; &nbsp; &nbsp; &nbsp; go g2(i+1, channels[(i+1)%3])&nbsp; &nbsp; &nbsp; &nbsp; go g3(i+2, channels[(i+2)%3])&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(<-channels[i%3])&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(<-channels[(i+1)%3])&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(<-channels[(i+2)%3])&nbsp; &nbsp; }}func g1(i int, chanel chan string) {&nbsp; &nbsp; chanel <- fmt.Sprintln("g1", i)}func g2(i int, chanel chan string) {&nbsp; &nbsp; chanel <- fmt.Sprintln("g2", i)}func g3(i int, chanel chan string) {&nbsp; &nbsp; chanel <- fmt.Sprintln("g3", i)}output&nbsp;g1 1g2 2g3 3g1 4g2 5g3 6g1 7g2 8g3 9但请记住,在此解决方案中,您必须运行 3 个 goroutine,然后等待它们全部给出结果,然后返回如果这不适合您,则需要使用缓冲通道。
随时随地看视频慕课网APP

相关分类

Go
我要回答