scala - 我应该覆盖默认的 ExecutionContext 吗?

标签 scala concurrency

在 scala 中使用 future 时,默认行为是使用默认的 Implicits.global 执行上下文。看来这默认为每个处理器提供一个可用线程。在更传统的线程 Web 应用程序中,当 future 执行诸如等待数据库之类的任务(而不是某些 cpu 绑定(bind)任务)时,这似乎是一个糟糕的默认值。

我希望覆盖默认上下文在生产中是相当标准的,但我发现关于这样做的文档很少,看起来它可能并不那么常见。我错过了什么吗?

最佳答案

与其将其视为覆盖默认执行上下文,不如问“我应该为不同的事情使用多个执行上下文吗?”如果这是这个问题,那么我的答案是肯定的。在我工作的地方,我们使用 Akka。在我们的应用程序中,我们使用默认的 Akka 执行上下文来实现非阻塞功能。然后,因为目前没有好的非阻塞 jdbc 驱动程序,所以我们所有的阻塞 SQL 调用都使用单独的执行上下文,其中每个连接一个线程的方法。保持主执行上下文( fork 连接池)不受阻塞会显着增加我们的吞吐量。

我认为在系统中针对不同类型的工作使用多个不同的执行上下文是完全可以的。这对我们来说效果很好。

关于scala - 我应该覆盖默认的 ExecutionContext 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834339/

相关文章:

concurrency - 用 Erlang 写传统的并发问题容易吗?

c++ - 强制将缓存行迁移到另一个核心

java - 从 Scala 到 Java 的翻译

mysql - MySQL : ClassNotFoundException on driver 的 Slick 2.1 代码生成器

java - 使用 ListBlockingQueue 线程的并发运行由于某种原因被阻塞

scala - Clojure 的代理与 Scala 的 Actor 相比如何?

java - 在 HashMap 值对象上同步

scala - Scala specs2与上下文嵌套

scala - scala 编译器对类型系统内的单元类型有什么特殊的规则

multithreading - Play Framework : What happens when requests exceeds the available threads