当前位置: 首页 > 网络应用技术

Scala +未来实施异步编程

时间:2023-03-07 14:48:48 网络应用技术

  多核处理器和并行任务的逐步普及,人们越来越关注异步编程。Scala标准库中提供的未来使您能够在获得真实的执行结果之前通过,并等待收集操作在下一次转换之后获得异步结果。

  我们不需要等待阻塞的方式等待每个步骤,而是要使用未来快速构建异步的操作流线,以获得一系列不可变的结果。

  早在作者面前引入的实际演示,例如Akka,Play等。我们已经揭露了未来。在此主题中,它将详细介绍如何正确使用它。

  Java将每个对象的逻辑监视器(监视器)关联,以控制对数据的多线程访问。通过此模型,我们决定可以通过多线程共享哪些数据,并使用关键字“锁定”。

  实际上,使用锁定模型来创建一个强大的多线程应用程序,这实际上是一件非常困难的事情。对于需要共享的每个数据,我们需要锁定它并确保它不会导致死锁的问题。但是,即使我们主动锁定数据,它们在编译期间也不是固定的。在操作过程中,该程序仍然可以任意创建一个新的锁。

  后来,Java提供了提供更高级别抽象同步的袋子,至少比通过各种同步语法手动的速度更快,以实现不稳定的同步机制。但是,此类工具包仍然基于共享数据和锁,因此他们没有解决各种困难这种类型的模型本质上。

  Scala Future减轻了程序员共享数据和锁定处理的负担。如果函数的执行结果返回一个,则意味着它将返回另一个计算以实施异步,以及哪些线程可以处理此稍后处理此稍后的异步计算,Scala提供的执行上下文将是.LET的决定。

  因此,在使用未来实现异步编程之前,我们需要介绍上下文:

  这几乎是必须的,否则该程序将在编译时报告错误。我们通过伴奏对象提供的方法创建第一个“未来计划”:

  有两种方法可以确定这种异步计算是否结果是:

  该方法为什么要制作两层包裹?首先,您需要考虑是否完成了此异步计算。因此,最外层的一层返回类型。如果有计算结果,请返回,否则。

  此外,计算结果还包括两种情况。如果计算时没有错误,则可以在类中返回计算结果。相反,呼叫将返回一个。

  该类代表两个异步操作的两个可能的结果。其目的是在同步计算中提供类似的效果,使程序员可以处理自己的返回。

  在异步编程中,语句将不再有效,因为计算通常在其他线程中执行,导致原始线程中的异常。这次,大写的类型被安排了:如果抛出异步计算,则意味着,它意味着该计算此计算过程中有一些事故。

  可以通过异步计算,并且该操作连接到另一个异步计算。例如:

  第一个异步计算将在3秒后执行并返回值类型。理想地,当第一个异步计算完成后,下一步将刚刚添加到现在的返回值中。此过程再次命名。显然,其计算返回值仍然是一种类型。

  对于主线程,将在大约5秒后获得结果:9。

  Scala的表达功能比Java强得多,包括结合未来的计算事件。

  基于上述异步操作,我们创建了第三个操作以添加两个操作。代码列表如下:

  在底层中,for循环实际上将此代码转换为串行句子公式:。从主要程序到完成计算,总共花费了3秒(而不是5秒),因为上述代码以异步为止完成了环境。

  我们可以绘制一个简单的培养皿地图,并找到此图片的最短完成时间(请参阅离散数学主题:关键路径的相关知识)。

  请注意,如果您使用表达式更改,则必须在for循环的前面进行声明,否则for表达方式将在串行环境中完成。

  提供许多已完成的未来工厂方法:并且这些方法无需手动导入。

  使用如何创建完整的未来:

  使用如何创建完整的未来:

  如果您不确定抛出了哪种情况,请致电:

  我在本文中提到的是同步等候机制,主线程将在有限的时间内等待未来。

  我们介绍了另一个软件包:这使我们可以使用此方法来表示我们的最大等待时间(作者在隐藏的转换章节中介绍了如何实现它)。

  有两种主要方法。第一个用法是将另一个主线程调用到封锁等待,直到未来的返回值。

  通常用来获得未来的回报值以进行进一步的操作。如果您只关心未来的完成,则可以调用该方法。未来仍在工作时,主线程将等待长达3秒钟。

  此外,可以发现这个未来是由另一个线程执行的:。

  建议:如果您输入了未来空间,请尽量不要使用阻止未来的执行。Scala提供了一种注册“回调函数”的方法,以使您通过功能副作用在未来获得未来的价值。

  此方法不会阻止主线程。为了查看程序的结果,我们需要主动调用主线程以睡觉,否则该程序将立即结束。返回值是数据类型。

  一个未来可以绑定多个。但是,上下文环境不能保证将将来首先触发,并且该方法保证了回调函数的执行顺序。

  要执行上述过程,控制台可以先打印或首先打印。

  该方法将返回原始未来的镜子,并且只有在将来调用后才执行。

  当我们不确定未来何时完成时,我们可以使用“承诺”来说,在某个未来的时间点,它肯定会值得。

  但是,该值的计算实际上委托给其他未来要完成。在计算结果后,将要求“实现”承诺的承诺方法。

  考虑到异常情况,除了该方法之外,它还提供了其他方法。没有什么方法,只能使用一次。

  然后承诺将进入现成的状态。我们在刚刚引入的回调函数中使用其返回值的“兑换”。

  在这里充当代理。它有望计算并提供其提供的价值的价值。程序的呼叫者可能不在乎:也许是,也许是。因此,我们只需要为Agent()设置回调函数,而不是其他将来。为了促进理解,请在此处提供一个连贯的代码列表:

  Scala提供了两种方法来检查或过滤您未来的回报值。测试未来结果的方法。如果值合法,请保留它。以下示例确保返回值是满意的值。注意执行后的示例执行方法,获得另一个未来值。

  如果它不符合匹配的要求,它将返回。您可以在其中捕获它。

  该方法允许您使用偏置函数在中间执行中间转换。您可以使用该语句缩写偏置功能。

  Scala提供了几种未来的方法:包括和和。例:如果执行期间持久出现异常出现,则该方法将返回成功的示例。

  如果未来是正常执行的,则该方法将把它扔掉。

  该方法提供了一种保险机制,该机制使原始未来无法运行另一个未来2。

  无论它是否成功,它将始终运行(作者测试),因此请勿在此处设置一些副作用。运行成功时,返回值将被忽略,并且其实际返回的返回值是.in失败的情况,该方法的返回值将生效。

  如果执行期间发生异常,它将忽略它的异常,将被捕获的是前一个级别的原始异常。

  另一种方法和方法的逻辑是相似的:如果它捕获异常,它允许您根据异常类型采用相应的策略和返回值。但是,如果成功地称呼原始的未来执行,则该备用值也将被忽略。以同样的方式,如果在传播偏差中没有特定异常的处理,则原始异常将是透明的。

  Future's方法接收到两个功能要更改,它们分别用于处理成功和失败。注意,在Scala版本2.12之前,需要传递两个功能,因此作者不以部分功能的形式使用句子。

  该方法是独立的另一个未来,与原始未来无关。因此,原始未来的结果将无法涵盖这一新未来的价值。

  该方法可以将两个未来的结果集成到双重组表格中并返回。但是,如果未来失败,它将引发异常。如果两个未来失败,抛出了前一个未来的异常,或呼叫方法。

  未来的伴侣对象提供了积累多个未来计算结果值的方法。相似,如果将来失败,最终未来也将失败。如果多个将来的执行失败,该方法只会引发第一个异常。

  以下是与本章未来相关的相关依赖性: