了解Scalaz Future和Task的一点帮助

18 concurrency asynchronous scala scalaz scalaz7

我试图了解背后scalaz concurrent包,主要是未来和任务类的想法和目的,但在一些应用程序中使用它们时,它现在从简单的顺序模拟远,然而scala.concurrent.Future,更多的工作更好地然后.任何人都可以分享他使用scalaz编写并发/异步应用程序的经验,基本上如何async正确使用它的方法?据我所知,从源代码async不使用单独的线程,如调用标准future,或fork/applyscalaz工作的方法,那么为什么它被调用async呢?这是否意味着为了与scalaz实现真正的并发,我总是要调用fork(now(...))apply

Pio*_*lka 17

我不是斯卡拉兹专家,但我会尽力帮助你.让我试着逐一回答你的问题:

1)任何人都可以分享他使用scalaz编写并发/异步应用程序的经验,基本上如何正确使用它的异步方法?

我们先来看看async签名:

def async[A](listen: (A => Unit) => Unit): Future[A]

起初这可能有点神秘,因此一直以来最好先查看测试以了解可能的用例.在https://github.com/scalaz/scalaz/blob/scalaz-seven/tests/src/test/scala/scalaz/concurrent/FutureTest.scala中, 您可以找到以下代码:

"when constructed from Future.async" ! prop{(n: Int) =>
  def callback(call: Int => Unit): Unit = call(n)
  Future.async(callback).run must_==   
}
Run Code Online (Sandbox Code Playgroud)

正如我们从签名中所知,Future.async只使用签名功能构建新的Future (A => Unit) => Unit.这真正意味着Future.async作为参数函数,对于给定的回调进行所有必需的计算并将结果传递给该回调.
重要的是要注意它Future.async本身不运行任何计算,它只准备结构以便以后运行它们.

2)据我所知,async不使用单独的线程,比如调用标准的future,或者scalaz的fork/apply方法,所以为什么它被称为async呢?

你是对的.只有fork并且apply似乎使用线程运行任何东西,这很容易注意到查看包含的签名implicit pool: ExecutorService.我不能在这里为作者说话,但我猜async与回调有关.这意味着不是阻止Future在最后获得结果,而是使用异步回调.

3)这是否意味着为了使用scalaz获得真正的并发性,我总是必须调用fork(now(...))或者应用?

从我可以说,是的.请注意,当您使用语法创建Future时,您在此处Future(x)使用apply方法,因此这是一种默认行为(这很好).

如果你想更好地理解Scalaz Futures的设计,我建议你阅读"Scala中的函数编程".我相信本书是由主要的Scalaz贡献者编写的,第7章讨论了为纯函数并行库设计API.它与Scalaz Future不完全相同,但你可以看到很多相似之处.