将AkkaHttp与Scala一起使用,以下代码为/api/endpoint/{DoubleNumber}
提供了一个端点。查询此端点会触发繁重的计算,然后将结果返回为application/json
。
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer
object Run {
def main(args: Array[String]) = {
implicit val system = ActorSystem("myApi")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
val e = get {
path("api/endpoint" / DoubleNumber) {
case (myNumberArgument) {
val result = someHeavyComputation(myNumberArgument)
complete(HttpEntity(ContentTypes.`application/json`, result.toString))
}
}
}
}
}
如果从浏览器的控制台发送多个并发请求,则上述代码将等待每个请求完成(并返回响应),然后再开始处理下一个请求。
如何修复上述代码以使其并行工作,换句话说,如果以前的请求仍在处理中,则为每个传入请求启动一个额外的进程?
答案 0 :(得分:1)
看起来我找到了答案。
如果您遇到同样的问题,只需在someHeavyComputation
块内 complete()
块中调用val e = get {
path("api/endpoint" / DoubleNumber) {
case (myNumberArgument) {
complete {
val result = someHeavyComputation(myNumberArgument)
HttpEntity(ContentTypes.`application/json`, result.toString)
}
}
}
}
,而不是之前:
{{1}}
必要时将启动新流程。