Groovy 的增强未来

Groovy 的增强未来

原文:https://medium.com/hackernoon/enhanced-futures-for-groovy-b8b8956543fa

在 Scala 中工作一段时间后,从函数式编程的角度来看,一些常见的问题看起来更容易了,尤其是在并行系统中工作时。

我今天不得不用 Groovy 写了一些多线程代码。我不是一个很棒的专家,但远非如此。然而,不管是哪种语言,编写并发代码都不应该那么难,对吗?

正在讨论的问题如下。我需要运行一些代码,A,当 A 完成时,我需要运行一些其他代码 B 和 c。这些链可以像我需要的那样复杂。

我查看了 Groovy 并发工具集。我可以创造未来。不错!这应该很容易。

思考我想在 Scala 中做的事情。

这是链接异步计算的一个非常好的方法。

现在,如果我有另一个计算链,比如说anotherFuture

我们可以使用 Scala 进行同步。

在这里我们可以用 代替 ,因为未来是一个单子,或者说是一种单子,至少它在大多数时候表现得像一个单子。

回到我的 Groovy 代码,我发现那里的未来和 Scala 的几乎没有共同之处。

在 Groovy 中,要运行异步操作,我们需要这样的东西。

为了从future中得到结果,我们必须在这里做future.get()``.get()将以 Scala 相同的方式阻塞。问题是我找不到一种方法来定义如何处理future的结果而不被阻塞。

当然,我可以通过 do 向池提交多个任务。

但这不是我需要的。我必须能够链接操作,并将一个任务的结果传递给下一个异步任务。

好吧,我自己完成了。

我们将把我的新未来叫做Continuation,这只是我取的一个名字,没什么特别的。它将从 Future 继承,所以我们也可以将它发送到一个执行池,我们最后将添加一个单子映射函数或方法,这是它们在 Groovy 中的调用方式。

为了创造一个延续,我们需要传递它将使用的未来。

Continuation 实现了 future 的相同功能,但使用的是潜在的 Future。

最重要的部分是延续增加了一个新功能,map。函数map接收一个Closure<B>ExecutorService作为执行池,并通过创建一个新的 Future 返回一个新的Continuation<B>,该 Future 从 async 获取值并传递给Closure注意,这是一个非阻塞操作。

回到最初的问题。

我们现在可以用 Groovy 来做。

在这里,y是传递给下一个.mapsomeLogicB(x)的结果。

注意,我们将pool传递给每个 map,但是记住 Scala Futures 需要一个隐式传递的 ExecutionContext。

结论

Scala 并发性很棒,这不是秘密。然而,我们不能被自己选择的语言拒之门外( Scala 是我的)。有时候我们需要用手头的工具来解决问题。如果您没有或没有找到所需的工具,那么就自己去构建它。

不要害怕Monad。单子是一种数学结构,在编程中有着广泛的用途,尤其是在函数式编程中。单子是链接操作的一种非常有趣的方式,正如我们在map中看到的。我们的Continuation 不是一个 完整的 单子,而是map背后的想法是从那里来的

记得先写你的测试。


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除