加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中多个期货的奇怪案例

发布时间:2020-12-16 09:31:22 所属栏目:安全 来源:网络整理
导读:这些与Scala之间的未来相关的类和特征之间的联系是什么,为什么它们会分散在不同的包中? 我找到了那些: abstract class scala.actors.Futureobject scala.actors.Futurestrait/object scala.collection.parallel.FutureThreadPoolTaskstrait scala.concurr
这些与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._

抽象班未来

首先,让我们看看文档的内容:

A function of arity 0,returing a value of type T that,when applied,blocks the current actor (Actor.self) until the future’s value is available.

这基本上都是有的。如果您正在与另一位演员之间的任何地方进行通信(可以使用发件人参考,只需使用发件人参考,就可以接收到消息的异步回复),并且您需要回复发送的消息,您有两种选择:

>发送阻止消息,等待直到Actor完成计算结果
>使用返回未来的方法发送消息,仅在真正需要有问题的值(然后可能已被计算的值)的情况下阻止该Future,

所以一个未来是一个尚不存在的价值观念的吸引人,但可能在不久的将来。以下也很有趣:

A future can be queried to find out whether its value is already available without blocking [using “isSet”].

这允许您执行任何所需,直到您需要的值已被计算/获取,您可以定期检查该值是否可用。

当挖掘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
> ParSeq
> ParSet
> ParMap

您可能已经知道或猜到了,这些集合可以并行执行所有可能的操作,而无需担心。一个小示范:

(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,所以让我们先看看那个。特征之上的评论说:

A trait that declares task execution capabilities used by parallel collections.

从其他来源意见和“任务”特征中找到的方法来看,任务表示需要计算的工作单元。依赖于或不是一个问题可以进一步划分,如果有更多的资源可用,任务可以通过创建更多的任务来进一步分解任务。

现在,FutureThreadPoolTask??s trait本身只是一种计算任务的方法,它使用java.util.concurrent.Future类进行同步,也就是说它不使用scala.actors.Future!来源:

An implementation of tasks objects based on the Java thread pooling API and synchronization using futures.

对象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一样,应该是一个非阻塞调用,以查看该值是否已被计算,并且应用方法应该用于实际检索该值。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读