Scala中普通同步流中异步代码的混合 你认为最好的Scala解决方案是,你有一些简单的同步函数调用链,你需要在中间中间添加一个异步动作而不阻塞?
我认为未来需要重构现有代码以回调意大利面,通过以前的同步函数调用链将未来一路拴在一起,或者在每个间隔轮询承诺,虽然不是很理想,但可能我在这里遗漏了一些琐碎/合适的选项 对于(akka)参与者的重构,似乎需要为这样一个简单的工程壮举准备大量的样板文件 如何在现有同步流中插入异步函数,而不阻塞,也不进入大量样板文件Scala中普通同步流中异步代码的混合 你认为最好的Scala解决方案是,你有一些简单的同步函数调用链,你需要在中间中间添加一个异步动作而不阻塞?,scala,asynchronous,Scala,Asynchronous,我认为未来需要重构现有代码以回调意大利面,通过以前的同步函数调用链将未来一路拴在一起,或者在每个间隔轮询承诺,虽然不是很理想,但可能我在这里遗漏了一些琐碎/合适的选项 对于(akka)参与者的重构,似乎需要为这样一个简单的工程壮举准备大量的样板文件 如何在现有同步流中插入异步函数,而不阻塞,也不进入大量样板文件 现在在我的代码中,我用Await.result阻塞,这仅仅意味着线程正在休眠…一个简单的肮脏技巧: 假设你有: def f1Sync: T1 def f2Sync: T2 ... def
现在在我的代码中,我用
Await.result
阻塞,这仅仅意味着线程正在休眠…一个简单的肮脏技巧:
假设你有:
def f1Sync: T1
def f2Sync: T2
...
def fAsynchronous: Future[TAsync]
import scala.concurrent.{ Future, Promise }
object FutureHelper {
// A value class is much cheaper than an implicit conversion.
implicit class FutureConverter[T](val t: T) extends AnyVal {
def future: Future[T] = Promise.successful(t).future
}
}
然后您可以获得收益率:
import FutureHelper._
def completeChain: Future[Whatever] = {
for {
r1 <- f1Sync.future
r2 <- f2Sync.future
.. all your syncs
rn <- fAsynchronous // this should also return a future
rnn <- f50Sync(rn).future// you can even pass the result of the async to the next function
} yield rn
}
导入FutureHelper_
def completeChain:未来[无论什么]={
为了{
r1您也可以使用async/await库,但需要注意的是,您最终会遇到一个仍然需要处理的巨大未来:
但是,它会产生与同步代码几乎相同的代码;在先前阻塞的地方,您添加了一个:
await { theAsyncFuture }
然后继续使用同步代码。您想对异步调用的结果做什么?谢谢您的提问。检查其值以进行下游处理,而不是火灾和伪造。我假设您指的是实现。虽然我现在已经习惯了映射未来,但在弄清楚它如何分配线程。