Scala中多个期货的奇怪案例
这些与Scala之间的未来相关的类和特征之间的联系是什么,为什么它们会分散在不同的包中?
我找到了那些: abstract class scala.actors.Future object scala.actors.Futures trait/object scala.collection.parallel.FutureThreadPoolTasks trait scala.concurrent.FutureTaskRunner trait scala.parallel.Future (the package consists of only this file...) 他们有什么不同的东西,还是有什么不能巩固的原因呢? 有没有一个很好的例子显示什么时候使用一个或另一个? 编辑:赏金来解释每个类/特征/对象的作用,以及它们如何证明它们的存在/它们是如何有用的。 解决方法
scala.actors._
抽象班未来 首先,让我们看看文档的内容:
这基本上都是有的。如果您正在与另一位演员之间的任何地方进行通信(可以使用发件人参考,只需使用发件人参考,就可以接收到消息的异步回复),并且您需要回复发送的消息,您有两种选择: >发送阻止消息,等待直到Actor完成计算结果 所以一个未来是一个尚不存在的价值观念的吸引人,但可能在不久的将来。以下也很有趣:
这允许您执行任何所需,直到您需要的值已被计算/获取,您可以定期检查该值是否可用。 当挖掘Scala图书馆的源代码时,我发现Futures实际上只是演员。未来本身是一个抽象类,它由私有类FutureActor扩展。最后一个类是实际实现Future功能的类。 对象期货 对象期货迄今没有什么有趣的,因为它只是“期货经营方法”的容器,即方便的工厂方法未来,可以异步评估通过的块,返回一个代表结果的未来。一个小例子是: import scala.actors.Futures val f = Futures.future { println("Start: inside block") val s = System.currentTimeMillis while(System.currentTimeMillis < (s + 1000)) { // Simulate computation } println("Start: end of block") 42 } println("After future") println(f()) println("The end") 这应该会导致类似的东西 Start: inside block After future Start: end of block 42 The end 这表明未来呼叫在您实际尝试检索未来的值之前不会阻止以下代码(请注意,输出为non-deterministic.未来也可能出现在输出的开头)。 scala.collection.parallel 这个软件包是Scala 2.9.x的新功能,并为我们最喜??爱的一些集合实现了并行对应。这些都是从Par: > Pariterable 您可能已经知道或猜到了,这些集合可以并行执行所有可能的操作,而无需担心。一个小示范: (1 to 10).par.map { b => print(b + " "); b * b } 3 1 6 2 7 4 5 9 10 8 # => (1,4,9,16,25,36,49,64,81,100) 结果将始终是相同的,但是元素的处理顺序又是非确定性的。另外,如果您使用的是多核系统,那么对于较大的集合,您可能会遇到很好的性能提升。 trait FutureThreadPoolTask??s FutureThreadPoolTask??s trait扩展了Tasks trait,所以让我们先看看那个。特征之上的评论说:
从其他来源意见和“任务”特征中找到的方法来看,任务表示需要计算的工作单元。依赖于或不是一个问题可以进一步划分,如果有更多的资源可用,任务可以通过创建更多的任务来进一步分解任务。 现在,FutureThreadPoolTask??s trait本身只是一种计算任务的方法,它使用java.util.concurrent.Future类进行同步,也就是说它不使用scala.actors.Future!来源:
对象FutureThreadPoolTask??s 再次不是很壮观,只是一个包含FutureThreadPoolTask??s trait使用的几个(实际上只有三个)实用程序方法的伴侣对象。 scala.concurrent 这些类的文档是非常糟糕的,显然很少(如果有的话)(我没有找到一个)示例演示这些类的用法。我一定会尝试收集更多的信息,并尽快扩大本节! scala.parallel 特质未来 这似乎是一个“进步中”,因为scala.parallel包只包含这个特征。从我可以看出,这将与未使用演员的未来实现有关,但这只是一个猜测。特征的签名如下 trait Future[@specialized +R] extends (() => R) 我甚至不会试图解释the @specialized annotation或variances (在通用的R类型之前),但是这个特征的基本思想是,未来是一个函数,当被执行时返回值(如果它是尚未计算)。 而且,trait本身只有两种方法,apply和isDone。我的猜测是isDone,就像scala.actors.Future.isSet一样,应该是一个非阻塞调用,以查看该值是否已被计算,并且应用方法应该用于实际检索该值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Sequentially Sending Request to WebService Se
- -bash:./ configure:没有这样的文件或目录 –
- Webservice学习笔记六,SOAP, REST and XML-RPC报
- 爱创课堂2016年Angular.JS前端开发从入门到上手企
- Axis2实现WebService实例 HelloWord
- shell – 如何使用Capistrano V3运行需要sudo的命
- 如何在Scala中将字符串转换为运行时符号?
- scala – 如何将WebJars添加到我的Play应用程序?
- scala – 类型变量的类型模式的用例和示例
- 在Unix中删除我的文件[已关闭]