[英]handling scala futures out of memory error
我正在嘗試使用期貨使 scala 進程並行,
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))
val result = Future.traverse(listOfInputs) { input =>
Future {
// time consuming process
}
}
result.onComplete {
case Success(value) => display msg
case Failure(exception) => throw exception
}
以上工作正常,當輸入數量較少時,當輸入數量增加時,程序消耗更多 memory ,並且操作系統在執行期間殺死進程。
無論如何,我可以在哪里限制 memory 或線程在 Scala 中使用? 任何幫助表示贊賞。
在您的示例中,您使用了一個具有 5 個線程的固定大小的線程池,並且您正在使用Future { … }
構建 Future,這意味着每個 Future 只要它正在運行就會占用一個線程。 因此,在您的示例代碼中,並行度已經嚴格限制為 5,當您的示例代碼甚至無法演示問題時,很難對您的問題給出有用的答案。
也就是說,限制並行性的一種方法是使用信號量。 信號量基本上是一組有限的做事許可,如果您編寫代碼以便它在開始工作之前獲得許可並在完成后將其放回,這將限制您的應用程序中的並行量。 twitter 的 util-core 庫中有一個 Semaphore 實現。
https://github.com/twitter/util
https://twitter.github.io/util/docs/com/twitter/concurrent/AsyncSemaphore.html
val sem = new AsyncSemaphore(5)
val result = Future.traverse(listOfInputs) { input =>
sem.acquireAndRun {
// create Future here.
}
}
但是,我建議完全使用其他東西,因為 Scala 期貨太可怕了。 它們缺乏諸如異步 try/finally 構造或中斷計算的能力等基本功能。
ZIO 具有這些功能以及許多內置功能。例如,您可以使用ZIO.foreachParN
方法遍歷列表。 它將限制並行性,並且如果您的一個計算因錯誤而失敗,它將中止所有其他計算以避免浪費時間和 memory。 打開文件等資源將被自動釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.