通道不是 运行 并行的 Go 例程

Go-routines with channels not running parallely

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";
}

输出:

内部字符串返回器

打印字符串:abcd

等待 5 秒

内部返回者

打印整数:1

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

为什么执行此编码需要 10 秒而不是 5 秒?我们通过生成两个 go-routines 来并行化调用(1 个用于字符串返回器,1 个用于 int 返回器),但是为什么 int 返回器在字符串返回器执行之后执行?

那是因为您只是并行写入通道。但是从通道读取是一个接一个地发生。要解决此问题,您可以从单独的 go routines

的两个通道读取
var wg sync.WaitGroup
wg.Add(2)
go func() {
  defer wg.Done()
  str := (<-stringCh)()
  print("Printing str: ", str, "\n\n")
}()
go func() {
  defer wg.Done()
  num := (<-intCh)()
  print("Printing int: ", num, "\n\n")
}()
wg.Wait()

通道正在返回休眠函数,并且此类函数是按顺序调用的。所以一般需要10s。

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

根据将 sleep 方法移动到 go routine 中的建议 运行 两个函数在 5 秒内同时运行:

package main

import "time"

func main() {
    stringCh := make(chan func() string)
    go func() {
        time.Sleep(5 * time.Second)
        stringCh <- func() string {
            return stringReturner()
        }
        close(stringCh)
    }()

    intCh := make(chan func() int)
    go func() {
        time.Sleep(5 * time.Second)
        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 {
    print("Inside int returner\n\n")
    return 1
}

func stringReturner() string {
    print("Inside string returner\n\n")
    return "abcd"
}

输出:

Inside string returner

Printing str: abcd

Inside int returner

Printing int: 1