我在scala中有一个迭代器:
val collections: Iterator[Callable[Boolean]] = ...
我想对迭代器的每个元素应用一些东西,并对并发执行的数量进行约束。我在java线程池中使用了以下实现(使用了另一个SO示例):
val javaExecutor = Executors.newFixedThreadPool(numberThreads) // fixed thread pool
val scalaExecutor = JavaConversions.asExecutionContext(javaExecutor) //convert to scala executor
val futures: util.List[Future[Boolean]] = scalaExecutor.invokeAll(asJavaCollection(collections.toIterable)) // run pool, first convert Seq to java.util.Collection
// Here you have to be sure, that all task run
import ExecutionContext.Implicits.global
concurrent.Future(javaExecutor.shutdown()) // shutdown in new thread
val count = futures.map(future => Try(future.get)).count(_.isFailure)
这里的问题是,底层实现似乎是将所有可调用的内容放入队列中,以便将所有数据加载到内存中导致OutOfMemory
。我正在寻找一种方法来实现懒惰,意味着在任何时候都不会在内存中同时拥有所有可调用的内容。