我建议您设置自己的上下文,并使用 Plays 运行阻塞/CPU 密集型操作。与线程一样,最佳解决方案取决于许多因素,例如内核数量等。F.Promise<A>
首先在以下位置设置上下文:applications.conf
play {
akka {
akka.loggers = ["akka.event.Logging$DefaultLogger", "akka.event.slf4j.Slf4jLogger"]
loglevel = WARNING
actor {
default-dispatcher = {
fork-join-executor {
parallelism-min = 1
parallelism-factor = 2
parallelism-max = 6
}
}
my-context {
fork-join-executor {
parallelism-min = 1
parallelism-factor = 4
parallelism-max = 16
}
}
}
}
}
然后在你的控制器中,使用Play Promises(我使用的是Java 8)来利用你的上下文:
public static F.Promise<Result> love() {
ExecutionContext myExecutionContext = Akka.system().dispatchers().lookup("play.akka.actor.my-context");
F.Promise<Integer> integerPromise = F.Promise.promise(() ->
LongRunningProcess.run(10000L)
, myExecutionContext);
F.Promise<Integer> integerPromise2 = F.Promise.promise(() ->
LongRunningProcess.run(10000L)
, myExecutionContext);
return integerPromise.flatMap(i -> integerPromise2.map(x -> ok()));
}
这样,您的 Play 应用仍将处理执行上下文中的短期请求,并且阻塞/CPU 密集型请求将在 中运行。default-dispatcher
my-context
我为你做了一个非常简短的例子来演示这一点,在github上查看它。