How to configure a fine tuned thread pool for futures?

后端 未结 4 610
情书的邮戳
情书的邮戳 2020-11-28 02:16

How large is Scala\'s thread pool for futures?

My Scala application makes many millions of future {}s and I wonder if there is anything I can do to opti

相关标签:
4条回答
  • 2020-11-28 02:52
    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
          }
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-28 02:53

    This answer is from monkjack, a comment from the accepted answer. However, one can miss this great answer so I'm reposting it here.

    implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
    

    If you just need to change the thread pool count, just use the global executor and pass the following system properties.

    -Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
    
    0 讨论(0)
  • 2020-11-28 02:55

    You can specify your own ExecutionContext that your futures will run in, instead of importing the global implicit ExecutionContext.

    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) {}
    }
    
    0 讨论(0)
  • 2020-11-28 03:03

    best way to specify threadpool in scala futures:

    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();
        }
    
    0 讨论(0)
提交回复
热议问题