我应该覆盖默认的ExecutionContext吗?

Tom*_*tin 26 concurrency scala

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

我希望覆盖默认上下文在生产中是相当标准的,但我可以找到关于这样做的文档很少,似乎它可能不常见.我错过了什么吗?

cmb*_*ter 40

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

我认为在系统中为不同类型的工作使用多个不同的执行上下文是完全可以的.它对我们很有用.

  • 提及重要的决策因素是+1是否在期货中使用阻止(或长期运行)代码.如果不这样做,使用单独的执行上下文实际上是适得其反的. (3认同)