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

并发执行但序列化输出

并发执行但序列化输出

Go
缥缈止盈 2022-11-08 16:27:19
我需要使用 3 个名为g1, g2, g3. 并以循环方式在上述 3 个 goroutine 中分配 1-10 的数字。他们将根据提供的数字做一些假设性的工作。程序应按以下方式打印输出。g1-1g2-2g3-3g1-4g2-5g3-6...任务必须同时执行,但输出必须按顺序排列。我已经实现了下面的代码,它分配数字和打印,但如上所述不能保证输出打印顺序。我需要一些帮助来修复以下代码或关于另一种方法的建议以获得上述所需的输出。方法一:package mainimport (    "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- 1g1- 4g2- 2g3- 3g1- 7g2- 5g2- 8g3- 6g3- 9g1- 10...
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

如果您不想使用 slice ,那么我认为这样的事情会起作用:-(操场)


package main


import (

    "fmt"

)


func main() {


    chang1 := make(chan string)

    chang2 := make(chan string)

    chang3 := make(chan string)


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


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


        go g1(i, channels[i%3])

        go g2(i+1, channels[(i+1)%3])

        go g3(i+2, channels[(i+2)%3])


        fmt.Print(<-channels[i%3])

        fmt.Print(<-channels[(i+1)%3])

        fmt.Print(<-channels[(i+2)%3])

    }


}


func g1(i int, chanel chan string) {


    chanel <- fmt.Sprintln("g1", i)


}


func g2(i int, chanel chan string) {


    chanel <- fmt.Sprintln("g2", i)


}


func g3(i int, chanel chan string) {


    chanel <- fmt.Sprintln("g3", i)


}

output 

g1 1

g2 2

g3 3

g1 4

g2 5

g3 6

g1 7

g2 8

g3 9

但请记住,在此解决方案中,您必须运行 3 个 goroutine,然后等待它们全部给出结果,然后返回


如果这不适合您,则需要使用缓冲通道。


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

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