go - 通道不并行运行的 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 执行后执行?
解决方案
该通道正在返回带有睡眠的函数,并且该函数以顺序方式被调用。这就是为什么它通常需要 10 秒。
推荐阅读
- jenkins - Jenkins 在不同的代理上并行构建
- arrays - MongoDb 从数组中更新多个对象
- python - Python skimage.io
- python - 将字符串分配给字典中的整数
- openlayers - OpenLayers:层不填充容器
- ruby-on-rails - “从购物车中删除产品”按钮不起作用
- ssrs-2008-r2 - SSRS - 带空格的字体
- c - 在套接字上设置超时不起作用
- unity3d - 为什么 Hidden/Fastblur 着色器不再适用于 iOS for Unity 2018?
- javascript - 在 Woocommerce 可变产品上获取 jQuery 中选定的变体价格