Scala AkkaHttp:与多个进程并行处理传入请求

Scala AkkaHttp:与多个进程并行处理传入请求,scala,parallel-processing,akka-http,Scala,Parallel Processing,Akka Http,使用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.s

使用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))
        }
      }
    }
  }
}
如果一个用户从(比如)浏览器控制台发送多个并发请求,上述代码将等待每个请求完成(以及返回的响应),然后再开始处理下一个请求


如何修复上述代码以使其并行工作,换句话说,如果以前的请求仍在处理中,则为每个传入的请求启动一个额外的进程?

看起来我找到了答案

如果您有相同的问题,只需从
complete()
块内部调用
someheavycompution
,而不是在以下之前:

val e = get {
  path("api/endpoint" / DoubleNumber) {
    case (myNumberArgument) {
      complete {
        val result = someHeavyComputation(myNumberArgument)
        HttpEntity(ContentTypes.`application/json`, result.toString)
      }
    }
  }
}
必要时将启动新的程序