Nhóm chủ đề của Scala cho tương lai lớn đến mức nào?
Ứng dụng Scala của tôi tạo ra hàng triệu future {}
s và tôi tự hỏi liệu tôi có thể làm gì để tối ưu hóa chúng bằng cách định cấu hình nhóm luồng.
Cảm ơn bạn.
Nhóm chủ đề của Scala cho tương lai lớn đến mức nào?
Ứng dụng Scala của tôi tạo ra hàng triệu future {}
s và tôi tự hỏi liệu tôi có thể làm gì để tối ưu hóa chúng bằng cách định cấu hình nhóm luồng.
Cảm ơn bạn.
The reason is that map, flatMap methods of Action allows you to call arbitrary code when joining the actions together. Slick cannot allow that code to be run on its own execution context, because it has no way to know if you are going to tie up Slicks threads for a long time.
Câu trả lời:
Bạn có thể chỉ định ExecutionContext của riêng mình mà tương lai của bạn sẽ chạy, thay vì nhập ExecutionContext ngầm toàn cầu.
import java.util.concurrent.Executors
import scala.concurrent._
implicit val ec = new ExecutionContext {
val threadPool = Executors.newFixedThreadPool(1000)
def execute(runnable: Runnable) {
threadPool.submit(runnable)
}
def reportFailure(t: Throwable) {}
}
Câu trả lời này là từ monjack, một bình luận từ câu trả lời được chấp nhận. Tuy nhiên, người ta có thể bỏ lỡ câu trả lời tuyệt vời này vì vậy tôi đăng lại nó ở đây.
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
Nếu bạn chỉ cần thay đổi số lượng nhóm luồng, chỉ cần sử dụng trình thực thi toàn cục và chuyển các thuộc tính hệ thống sau.
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
cách tốt nhất để chỉ định threadpool trong tương lai scala:
implicit val ec = new ExecutionContext {
val threadPool = Executors.newFixedThreadPool(conf.getInt("5"));
override def reportFailure(cause: Throwable): Unit = {};
override def execute(runnable: Runnable): Unit = threadPool.submit(runnable);
def shutdown() = threadPool.shutdown();
}
class ThreadPoolExecutionContext(val executionContext: ExecutionContext)
object ThreadPoolExecutionContext {
val executionContextProvider: ThreadPoolExecutionContext = {
try {
val executionContextExecutor: ExecutionContextExecutor = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(25))
new ThreadPoolExecutionContext(executionContextExecutor)
} catch {
case exception: Exception => {
Log.error("Failed to create thread pool", exception)
throw exception
}
}
}
}