【问题标题】:Execution Context and Dispatcher - Best practices, useful configurations and Documentation执行上下文和调度程序 - 最佳实践、有用的配置和文档
【发布时间】:2015-12-06 12:10:40
【问题描述】:

Scala 执行上下文和调度程序 - 列表和比较:为什么?

关于在 Scala 中使用什么/如何/什么是最好的 Execution Context 以及如何配置调度程序存在很多问题。 我仍然无法找到更长的列表,其中包含优缺点和配置示例。

我能找到的最好的是 Akka 文档:http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html 和 Play 文档https://www.playframework.com/documentation/2.5.x/ThreadPools

我想问一下,除了scala.concurrent.ExecutionContext.Implicits.global 和 Akka 默认值之外,您在日常开发生活中还使用了哪些配置,什么时候使用它们,优缺点是什么。

以下是我已经拥有的一些:

第一个未完成的概述

标准:scala.concurrent.ExecutionContext.Implicits.global

测试 - ExecutionContext.fromExecutor(new ForkJoinPool(1))

  • 用于测试
  • 没有并行性

Play 的默认 EC - play.api.libs.concurrent.Execution.Implicits._

Akka 的默认执行上下文

隔板

ExecutionContext.fromExecutor(new ForkJoinPool(n)) based on an separated dispatcher . Thanks to Sergiy Prydatchenko

【问题讨论】:

  • ExecutionContext.fromExecutor(new ForkJoinPool(n))(或单独的 Akka 调度程序)不仅可用于测试,还可用于隔板(将 Futures 的一部分与另一个 Executor 分开)。

标签: scala concurrency playframework akka spray


【解决方案1】:

理想情况下只有非阻塞代码,您只需使用框架执行上下文。播放框架或 Akka 的。

但有时您必须使用阻塞 API。在一个 Play Framework 和 JDBC 项目中,我们遵循他们的建议 [1] 并将执行上下文设置为 100 个线程,并且在所有地方都使用默认值。该系统的使用和需求非常快。

在另一个 Akka 项目中,我们混合了阻塞和非阻塞代码,我们为不同的功能配置了单独的调度程序。像“blocking-dispatcher”、“important-feature-dispatcher”和“default-dispatcher”。这执行得很好,但比拥有 1 个调度员更复杂,我们必须知道/猜测/监控每个调度员需要多少。我们对它进行了负载测试,发现在 1 个线程时它太慢了,如果我们有 5 个线程它会更好,但在 10 个线程之后它并没有变得更快。所以我们将其保留为 10 个线程。最终,我们重构了我们的阻塞代码并将所有内容移至默认值。

但是每个用例都不同,您需要分析和监控您的系统以了解适合您的方案。如果你有所有非阻塞代码很容易,它应该是每个 CPU 核心 1 个线程。

[1]https://www.playframework.com/documentation/2.5.x/ThreadPools#Highly-synchronous

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    相关资源
    最近更新 更多