建立一个大任务计算与同步执行几个步骤相比如何?

时间:2018-10-04 05:47:21

标签: scala asynchronous monix

我有以下两个用Scala / Monix编写的代码:

def f1(input) =
  for {
    a <- task1(input)
    b <- task2(a)
    c <- task3(b)
  } yield (c).runSyncUnsafe

def f2(input) = {
  val a = task1(input).runSyncUnsafe
  val b = task2(a).runSyncUnsafe
  task3(b).runSyncUnsafe
}

我认为f1版本更好,因为它完全异步并且不会阻塞线程,我的假设是,如果有许多任务正在运行,则第一个应该在多线程中表现更好。

我知道我应该编写一个测试来比较这两种实现,但是这将需要大量重构遗留代码。同样,在我们的特定情况下,对这两个版本进行概要分析也不容易,因此我首先在这里问一下,希望能从具有很多Scala / Monix经验的人那里得到答案:

两者在重载下的性能如何比较?这是一个真正的问题还是非问题?

1 个答案:

答案 0 :(得分:0)

一般而言,最好保持尽可能长的异步时间。因此,您可以这样写f1

def f1(input) =
  for {
    a <- task1(input)
    b <- task2(a)
    c <- task3(b)
  } yield c

然后,呼叫者可以决定是调用runSyncUnsafe还是异步呼叫(runAsyncrunOnComplete)还是flatMap来执行其他任务。这样会从您的代码中删除Unsafe调用,并将其留给调用方来确定是否安全。

就性能而言,将以两种方式对任务进行顺序评估,因为以后的任务取决于先前任务的结果。