Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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的孤儿期货_Scala_Asynchronous_Future - Fatal编程技术网

Scala的孤儿期货

Scala的孤儿期货,scala,asynchronous,future,Scala,Asynchronous,Future,是否有一种惯用的方法来处理scala.concurrent.Future的副作用,其结果在调用方中并不真正需要(即,计算调用方法的返回值既不需要成功也不需要失败)?比如说, object XYZ { def log(s: String): Future[Unit] = ??? } 直接调用XYZ.log(“XYZ”)而不进行任何回调并继续执行真正重要的任务是否正确?这个孤儿般的未来不会被认为是代码气味吗?有没有可能在执行之前对其进行垃圾收集 这个孤儿般的未来不会被认为是代码气味吗 不超过任

是否有一种惯用的方法来处理scala.concurrent.Future的副作用,其结果在调用方中并不真正需要(即,计算调用方法的返回值既不需要成功也不需要失败)?比如说,

object XYZ {
  def log(s: String): Future[Unit] = ???
}
直接调用
XYZ.log(“XYZ”)
而不进行任何回调并继续执行真正重要的任务是否正确?这个孤儿般的未来不会被认为是代码气味吗?有没有可能在执行之前对其进行垃圾收集

这个孤儿般的未来不会被认为是代码气味吗

不超过任何其他丢弃的非
单位
值。请注意,有些人,这就是为什么
-Ywarn value丢弃
并存在的原因

有没有可能在执行之前对其进行垃圾收集

Future
对象本身可能会被垃圾收集,但它会将一个任务提交给一个线程池,而该线程池不会被垃圾收集(因为该池包含对该任务的引用)。除了这样的情况

def log(s: String): Future[Unit] = Future.just(())

当然,

当我们有这样的<代码>未来< /C> > s时,它们不是主业务逻辑的一部分,而是为了它们的副作用而执行的,也就是说,代表一个单独的关注点,例如日志记录,然后考虑在单独的专用执行上下文上运行它们。例如,使用创建一个单独的池

val numOfThreads = 2
val threadPoolForSeparateConcerns = Executors.newFixedThreadPool(numOfThreads, (r: Runnable) => new Thread(r, s"thread-pool-for-separate-concerns-thread-${Random.nextInt(numOfThreads)}"))
val separateConcernsEc = ExecutionContext.fromExecutor(threadPoolForSeparateConcerns)

然后确保在运行单独的关注点时传递它

object XYZ {
  def log(s: String, ec: ExecutionContext): Future[Unit] = ???
}

XYZ.log("Failed to calculate 42", separateConcernsEc)

通过将主业务逻辑线程池与线程池分离,我们可以最大限度地减少因资源匮乏等原因破坏主业务逻辑的可能性。

如果您想在未来完成时“做一些事情”,那么这不被认为是代码气味。这可能很好,我可能看到的唯一问题是,如果未来永远无法完成(无论出于何种原因),您的应用程序将挂起,并且您不会注意到原因。