Scala ExecutionContext作为类或方法参数是否更惯用?

kri*_*ath 2 scala future executioncontext

像这样的方法传递更惯用的ScalaExecutionContext

class Foo {
    def bar(a: Int, b: Int)(implicit ec: ExecutionContext): Future[Int] = {
        Future(a + b)
    }

    def baz(a: Int, b: Int)(implicit ec: ExecutionContext): Future[Int] = {
        Future(a - b)
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更好地通过ExecutionContext每个班级

class Foo(implicit ec: ExecutionContext) {
    def bar(a: Int, b: Int): Future[Int] = {
        Future(a + b)
    }

    def baz(a: Int, b: Int): Future[Int] = {
        Future(a - b)
    }
}
Run Code Online (Sandbox Code Playgroud)

是一种样式在Scala世界中通常更受欢迎,是因为它引起较少的惊喜,更易于阅读或其他原因?如果可能,请提供一些参考。

Tim*_*Tim 5

这两个选项具有不同的语义,因此都不是惯用的。

第一个选项允许调用方在调用时指定执行上下文,并允许将不同的上下文用于不同的调用。

第二个选项要求所有调用都使用相同的上下文。

选择取决于类和方法所需的语义。

  • 几乎可以肯定的是,对于任何阻塞,您都希望有一个单独的ExecutionContext,最重要的是,对于不同的子系统(数据库,外部HTTP调用,内部服务调用)使用不同的ExecutionContext可能是有意义的,因此您可以分别配置它们(例如不同数量的线程) (2认同)