【发布时间】:2016-09-08 17:29:01
【问题描述】:
我希望我可以用 golang 做类似下面的代码:
package main
import (
"fmt"
"time"
)
func getA() (int) {
fmt.Println("getA: Calculating...")
time.Sleep(300 * time.Millisecond)
fmt.Println("getA: Done!")
return 100
}
func getB() (int) {
fmt.Println("getB: Calculating...")
time.Sleep(400 * time.Millisecond)
fmt.Println("getB: Done!")
return 200
}
func main() {
A := go getA()
B := go getB()
C := A + B // waits till getA() and getB() return
fmt.Println("Result:", C)
fmt.Println("All done!")
}
更具体地说,我希望 Go 能够在后台处理并发。
这可能有点跑题了,但我很好奇人们对拥有这种隐式并发支持的看法。值得为此付出一些努力吗?以及潜在的困难和缺点是什么?
编辑:
需要明确的是,问题不在于“Go 现在在做什么?”,甚至不在于“它是如何实现的?”虽然我很欣赏@icza 发布的关于我们现在应该对 Go 有什么期望的帖子。问题是为什么它不能或不能返回值,这样做的潜在并发症是什么?
回到我的简单例子:
A := go getA()
B := go getB()
C := A + B // waits till getA() and getB() return
至少从语法的角度来看,我没有看到任何关于变量范围的问题。 A、B 和 C 的范围由它们所在的块明确定义(在我的示例中,范围是 main() 函数)。然而,一个可能更合理的问题是这些变量(这里是A 和B)是否“准备好”读取?当然,在getA() 和getB() 完成之前,它们不应该准备好并且可以访问。事实上,这就是我所要求的:编译器可以在幕后实现所有的花里胡哨,以确保执行将被阻止,直到 A 和 B 准备好使用(而不是强迫程序员使用通道显式实现这些等待和哨声)。
这可以使并发编程更加简单,特别是对于计算任务相互独立的情况。如果确实需要,这些通道仍可用于显式通信和同步。
【问题讨论】:
-
这幕后的东西太抽象了。 Goroutines 是不同的运行进程或线程,据我所知,在任何语言中都没有办法(或至少不推荐)在不显式调用 join 并检索值的情况下“加入”两个进程或线程的结果。跨度>
标签: go concurrency goroutine