我最近才了解了 Google 的编程语言 Go。我对它提供的并发支持很感兴趣,并着手了解更多有关它的信息。然而,我去看看 Go 是如何实现一个特定的并发特性的,到目前为止我还没有看到任何证据表明这个特性是存在的。
这是一个假设的情况:假设我们正在编写一个函数来确定特定输入的 Foo 值。对于任何给定的输入,Foo 值可以在域 A 或域 B 中找到(不在两者中)。这些领域的搜索技术大相径庭,但它们都有一个共同的特点,即成功的搜索往往会很快返回,而不成功的搜索必须遍历整个数据集才能详尽无遗,因此需要很长时间。
现在,在其他使用并发的语言(例如Cilk)中,可以对函数 Foosearch 进行编程,以便它产生一个 Asearch 函数和一个 Bsearch 函数。这些函数将同时运行,并且每当它们中的任何一个提出答案时,该答案都会报告给调用函数 Foosearch,该函数将终止它产生的任何未返回的函数。
然而,使用 Go 的 goroutine,您似乎只能将两个例程与一个通道连接 - 因此您无法设置 Asearch 或 Bsearch 可以发送到的通道,具体取决于哪个首先找到答案,并让 Foosearch 从它。看起来您也无法在不阻塞的情况下从通道中读取 - 所以您不能让 Foosearch 启动 Asearch 和 Bsearch 并从两者设置通道,然后在循环中运行以查看其中一个或另一个是否产生了答案。
我对 Go 并发限制的理解是否正确?还有另一种方法可以达到给定的结果吗?