Scala 在Play Framework 2.3.x中,ActionFunction默认是异步的吗?
他们说,在默认情况下,操作是异步的。当您使用ActionFunction和ActionBuilder之类的衍生工具组合动作时也是如此 我是说当你做这样的事情时:Scala 在Play Framework 2.3.x中,ActionFunction默认是异步的吗?,scala,asynchronous,playframework-2.0,Scala,Asynchronous,Playframework 2.0,他们说,在默认情况下,操作是异步的。当您使用ActionFunction和ActionBuilder之类的衍生工具组合动作时也是如此 我是说当你做这样的事情时: class AuthenticatedDbRequest[A](val user: User, val conn: Connection, request: Request[A]) extends Wrappe
class AuthenticatedDbRequest[A](val user: User,
val conn: Connection,
request: Request[A]) extends WrappedRequest[A](request)
object Authenticated extends ActionBuilder[AuthenticatedDbRequest] {
def invokeBlock[A](request: Request[A], block: (AuthenticatedDbRequest[A]) => Future[Result]) = {
AuthenticatedBuilder(req => getUserFromRequest(req)).authenticate(request, { authRequest: AuthenticatedRequest[A, User] =>
DB.withConnection { conn =>
block(new AuthenticatedDbRequest[A](authRequest.user, conn, request))
}
})
}
}
如果块可能会长时间阻塞,invokeBlock是否异步执行?是。
ActionFunction
的invokeBlock
方法返回一个Future[结果]
异步处理所有播放请求
当然,仅仅因为所有的请求都是异步处理的,并不意味着如果几个请求都有长时间运行的计算,那么应用程序就一切正常。也就是说,运行阻塞操作的请求不会阻塞整个服务器,但会阻塞处理请求的线程。如果这些请求足够多,那么您将耗尽请求处理线程,这将使新请求等待其他请求得到服务
.感谢您的回答和推荐,进一步阅读非常有趣,尤其是Play邮件列表上的线程。我的要求不太高,所以现在我将保持简单,但我会记住它。invokeBlock不是异步执行的(技术上它是由action builder同步执行的,在主体使用后异步执行),而是invokeBlock可以执行异步操作,在将来异步捕获它们的完成。如果要执行昂贵的操作,请在将来使用适当的执行上下文对其进行包装,这将异步将其分派到该执行上下文。