异步等待分配

时间:2016-06-04 08:22:27

标签: scala

我正在查看一些Scala服务器代码,我看到了async/await块{

}

async {
  while (cancellationToken.nonCancelled) {
    val (request, exchange) = await(listener.nextRequest)
    respond(exchange, cancellationToken, handler(request))
  }
}

这怎么可能是正确的语法?

据我所知:

每次执行while循环

  • 线程1将执行while循环中的代码,但await子句中的代码除外。
  • 线程2将进入await子句。

但是,如果线程2没有完成计算,则线程1将val (request, exchange)未实例化。

这些值将传递给未实例化的respondhandler方法。

那么如何在两个不同的线程中进行分配呢?

1 个答案:

答案 0 :(得分:1)

  

那么如何在两个不同的线程中进行分配呢?

async-await的主要目标是允许您以同步方式进行异步编程。

真正发生的是等待的调用执行listener.nextRequest并异步等待它的完成,在此之前它不会执行下一行代码。这保证了如果执行下一行代码,则会填充它的值。分配应该发生在方法中下一个LOC可见的位置。

这是可能的,因为async宏实际上将此代码转换为状态机,其中第一部分是执行直到第一个await,下一部分是事后的一切。