通道不是 运行 并行的 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。
根据将 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
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。
根据将 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