Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 在db调用中调用wait.result的风险有多大_Scala_Cassandra_Phantom Dsl - Fatal编程技术网

Scala 在db调用中调用wait.result的风险有多大

Scala 在db调用中调用wait.result的风险有多大,scala,cassandra,phantom-dsl,Scala,Cassandra,Phantom Dsl,使用phantom时,在db调用中遵循此模式有多危险: Await.result(dbOperationFut, 30.seconds) 这不是真正的幻影特定的,但它是正在使用的scala驱动程序 我对这种模式感到厌倦,因为潜在的GC暂停可能会持续超过x秒。给定GC暂停的安全时间是多少秒 我个人赞成使用for comp,而不是像这样阻塞,但我只是想知道这是一个非常糟糕的做法还是很好的做法 上下文:这将用于基于akka的应用程序akka、akka http 想法?注意等待结果 注意:这适用于Ak

使用phantom时,在db调用中遵循此模式有多危险:

Await.result(dbOperationFut, 30.seconds)
这不是真正的幻影特定的,但它是正在使用的scala驱动程序

我对这种模式感到厌倦,因为潜在的GC暂停可能会持续超过x秒。给定GC暂停的安全时间是多少秒

我个人赞成使用for comp,而不是像这样阻塞,但我只是想知道这是一个非常糟糕的做法还是很好的做法

上下文:这将用于基于akka的应用程序akka、akka http

想法?

注意等待结果

注意:这适用于Akka和play应用程序

只有在绝对必要时,才应非常小心地使用wait.result

在给定的持续时间之前,wait.result会阻止正在其中运行的线程。阻塞线程将浪费宝贵的计算资源,因为该线程将无法执行任何有用的计算,如处理新请求或算法中的数字运算等

因此,尽可能避免使用wait.result

但是,我们什么时候使用它等待结果呢

下面是使用Await.result的典型用例之一

假设您已经编写了一个包含主线程的程序,并且主线程内的所有计算都是异步的。现在,在主线程内启动异步计算之后。有些人必须停止主线程的存在,直到异步计算完成,否则程序将停止运行,并且您无法看到异步计算的结果

当应用程序开始运行时,有一个非守护进程线程,其任务是执行main。除非非守护进程线程完成,否则JVM不会自行退出

Future使用守护进程线程来运行。因此守护进程线程无法阻止JVM关闭。因此,即使非守护进程线程正在运行,JVM也会关闭

在上述情况下,如果没有主线程退出并且计算停止,那么在计算f完成之前,没有其他方法可以停止阻塞主线程

在大多数情况下,您不需要使用wait.result和使用map和flatMap的简单未来合成就足够了

使用wait.result的风险通常会导致所有阻塞代码

在基于事件的模型中线程不足

在基于事件的模型中,如果您有阻塞代码,并且需要很长时间才能返回,那么您将很快耗尽线程。在playframework中,任何阻塞调用都可能降低应用程序的性能,并且应用程序在线程耗尽时会变得非常缓慢

在非基于事件的模型中内存不足

在每个请求的线程模型中。当您有阻塞呼叫需要很长时间才能退出/返回时

案例1:若您有固定的线程池,那个么应用程序可能会耗尽线程

案例2:如果您有动态增长的线程池,那么您的应用程序将遭受太多的上下文切换开销,并且由于内存中有太多被阻塞的线程,也将耗尽内存


在所有情况下,除了等待一些IO或其他事件外,没有做任何有用的工作。

Wait.result在测试之外是非常不受鼓励的。我真的不知道它有什么风险。唯一的缺点是它是阻塞的。紧接着从@ AndyHayden和JasPer-M评论中,只有一次你应该考虑使用等待。当你有自己的主程序在实践中并不常见,你只是不想退出,直到你得到你的答案。在所有其他情况下,你应该能够将你未来的对象组合在一起,以供理解或其他用途。这并不能真正回答是否等待的问题。结果会带来任何风险…@Jasper-M用风险更新了答案。请随时指出任何错误和不清楚的信息。这样我就能修好它。感谢您提供更多详细信息,这将是一个akka应用程序,不能使用。@coolbreeze同样适用于akka。即使在akka中,也要避免处处阻塞。@Coolbreese这适用于所有应用程序,通常包括play和akka应用程序
object Main {
 def main(args: Array[String]): Unit = {
  import scala.concurrent.Future
  import scala.concurrent.duration._

  val f = Future { //do something }
  //stop main thread till f completes
  Await.result(f, 10 seconds)
 }
}