简体   繁体   English

通道不并行运行的 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";
}

Output:输出:

Inside string returner内部字符串返回器

Printing str: abcd打印字符串:abcd

WAIT OF 5 SECONDS等待 5 秒

Inside int returner内部 int 返回器

Printing int: 1打印整数:1

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

Why is this coding taking 10 seconds to execute instead of 5?为什么这个编码需要 10 秒而不是 5 秒来执行? We are parallelizing the calls by spawning two go-routines right (1 for string returner and 1 for int returner), but why is the int returner executing after the string returner executes?我们通过生成两个 go-routines 来并行化调用(1 个用于字符串返回器,1 个用于 int 返回器),但是为什么 int 返回器在字符串返回器执行之后执行?

The channel is returning function with sleep, and such function got called in sequential manner.通道正在返回带有睡眠的函数,并且该函数以顺序方式被调用。 That is why it will take 10s in general.这就是为什么它通常需要 10 秒。

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

Thats because you are only writing to the channels parallelly.那是因为您只是并行写入通道。 But the read from the channels are happening one-after-the-other.但是从通道读取是一个接一个发生的。 To fix this, you can read from both channels from separate go routines要解决此问题,您可以从单独的 go 例程中读取两个通道

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()

Based on the suggestions moving the sleep method into go routine to run both functions concurrently in 5s:根据将 sleep 方法移入 goroutine 以在 5s 内同时运行这两个函数的建议:

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

Output:输出:

Inside string returner

Printing str: abcd

Inside int returner

Printing int: 1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM