我正在查看一些Scala服务器代码,我看到了async/await
块{
}
async {
while (cancellationToken.nonCancelled) {
val (request, exchange) = await(listener.nextRequest)
respond(exchange, cancellationToken, handler(request))
}
}
这怎么可能是正确的语法?
据我所知:
每次执行while循环
await
子句中的代码除外。await
子句。但是,如果线程2没有完成计算,则线程1将val (request, exchange)
未实例化。
这些值将传递给未实例化的respond
和handler
方法。
那么如何在两个不同的线程中进行分配呢?
答案 0 :(得分:1)
那么如何在两个不同的线程中进行分配呢?
async-await的主要目标是允许您以同步方式进行异步编程。
真正发生的是等待的调用执行listener.nextRequest
并异步等待它的完成,在此之前它不会执行下一行代码。这保证了如果执行下一行代码,则会填充它的值。分配应该发生在方法中下一个LOC可见的位置。
这是可能的,因为async
宏实际上将此代码转换为状态机,其中第一部分是执行直到第一个await
,下一部分是事后的一切。