18 concurrency asynchronous scala scalaz scalaz7
我试图了解背后scalaz concurrent包,主要是未来和任务类的想法和目的,但在一些应用程序中使用它们时,它现在从简单的顺序模拟远,然而scala.concurrent.Future
,更多的工作更好地然后.任何人都可以分享他使用scalaz编写并发/异步应用程序的经验,基本上如何async
正确使用它的方法?据我所知,从源代码async
不使用单独的线程,如调用标准future
,或fork/apply
scalaz工作的方法,那么为什么它被调用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不完全相同,但你可以看到很多相似之处.