首页 > 解决方案 > 通道不并行运行的 Go-routines

问题描述

package main
import "time"
func main() {
    stringCh := make(chan func() (string))
    go func() {
        stringCh <- func() (string) {
            return stringReturner()
        }
        close(stringCh)
    }()

    intCh := make(chan func() (int))
    go func() {
        intCh <- func() (int) {
            return intReturner()
        }
        close(intCh)
    }()

    str := (<-stringCh)()
    print("Printing str: ", str,"\n\n")
    num := (<-intCh)()
    print("Printing int: ", num,"\n\n")     
}

func intReturner()int{
    time.Sleep(5 * time.Second)
    print("Inside int returner\n\n");
    return 1;
}

func stringReturner()string{
    time.Sleep(5 * time.Second)
    print("Inside string returner\n\n");
    return "abcd";
}

输出:

内部字符串返回器

打印str:abcd

等待 5 秒

内部 int 返回器

打印整数:1

https://play.golang.org/p/oE2ybs7Jo-W

为什么这个编码需要 10 秒而不是 5 秒来执行?我们通过生成两个 go-routines 来并行化调用(1 个用于 string returner,1 个用于 int returner),但为什么 int returner 在 string returner 执行后执行?

标签: goparallel-processinggoroutine

解决方案


该通道正在返回带有睡眠的函数,并且该函数以顺序方式被调用。这就是为什么它通常需要 10 秒。

https://play.golang.org/p/UpHD7Ttw03R


推荐阅读