Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Play Framework 2.3.x中,ActionFunction默认是异步的吗?_Scala_Asynchronous_Playframework 2.0 - Fatal编程技术网

Scala 在Play Framework 2.3.x中,ActionFunction默认是异步的吗?

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

他们说,在默认情况下,操作是异步的。当您使用ActionFunction和ActionBuilder之类的衍生工具组合动作时也是如此

我是说当你做这样的事情时:

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可以执行异步操作,在将来异步捕获它们的完成。如果要执行昂贵的操作,请在将来使用适当的执行上下文对其进行包装,这将异步将其分派到该执行上下文。