首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发执行但序列化输出

并发执行但序列化输出
EN

Stack Overflow用户
提问于 2022-02-17 12:22:07
回答 1查看 140关注 0票数 1

我需要使用名为g1g2g3的三个大猩猩。并以循环的方式将数字从1到10分发到上述3只猩猩中。他们将根据所提供的数字进行一些假设性工作。程序应以下列方式打印输出。

g1-1

g2-2

g3-3

g1-4

g2-5

g3-6

..。

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

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

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

方法1:

代码语言:javascript
复制
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

..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 13:41:12

如果您不想使用片,那么我想这样的东西会起作用的:- (游乐场)

代码语言:javascript
复制
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)

}
代码语言:javascript
复制
output 
g1 1
g2 2
g3 3
g1 4
g2 5
g3 6
g1 7
g2 8
g3 9

但是请记住,在这个解决方案中,您必须运行3个goroutines,然后等待所有它们都给出结果,然后返回

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71158069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档