【发布时间】:2021-09-09 20:36:24
【问题描述】:
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 秒
int 返回器内部
打印整数:1
https://play.golang.org/p/oE2ybs7Jo-W
为什么这个编码需要 10 秒而不是 5 秒来执行?我们通过正确生成两个 go-routines 来并行化调用(1 个用于 string returner,1 个用于 int returner),但为什么 int returner 在 string returner 执行后执行?
【问题讨论】:
-
虽然下面的答案在技术上是正确的,但关键的见解是“从 func 的 chan 中读取 func 值”和“执行 func”之间的区别。通常并发代码的结构是 goroutine 直接将值写入 chan(而不是生成值的 func)。
标签: go parallel-processing goroutine