Scala中Future的线程数

为什么Future最大只有4个并发线程?

线程池中有多少个线程是由ExecutionContext决定的。如果使用的是默认的global,则只有4个并发线程。

import scala.concurrent.ExecutionContext.Implicits.global

默认的global ExecutionContext在哪里设置的4个并发线程?

global用的是ExecutionContextImpl,其中有这么一段代码:

  1. def createExecutorService: ExecutorService = {
  2. def getInt(name: String, f: String => Int): Int =
  3. try f(System.getProperty(name)) catch { case e: Exception => Runtime.getRuntime.availableProcessors }
  4. def range(floor: Int, desired: Int, ceiling: Int): Int =
  5. if (ceiling < floor) range(ceiling, desired, floor) else scala.math.min(scala.math.max(desired, floor), ceiling)
  6. val desiredParallelism = range(
  7. getInt("scala.concurrent.context.minThreads", _.toInt),
  8. getInt("scala.concurrent.context.numThreads", {
  9. case null | "" => Runtime.getRuntime.availableProcessors
  10. case s if s.charAt(0) == ‘x‘ => (Runtime.getRuntime.availableProcessors * s.substring(1).toDouble).ceil.toInt
  11. case other => other.toInt
  12. }),
  13. getInt("scala.concurrent.context.maxThreads", _.toInt))
  14. val threadFactory = new DefaultThreadFactory(daemonic = true)
  15. try {
  16. new ForkJoinPool(
  17. desiredParallelism,
  18. threadFactory,
  19. uncaughtExceptionHandler,
  20. true) // Async all the way baby
  21. } catch {

庄家ForkJoinPool时设定了desiredParallelism。可以看到desiredParallelism函数得到并行度有多少是根据系统变量来的(注意getInt函数):

scala.concurrent.context.minThreads:最小并发线程数(Int)

scala.concurrent.context.numThreads:并发线程数,如果是Int,则就使用这个值;如果是String,并且以“x”开头,后面跟个Double(如“x1.5”),则其值为1.5 * Runtime.getRuntime.availableProcessors

scala.concurrent.context.maxThreads:最大并发线程数(Int)

如果这三个变量没有设置,则getInt会取Runtime.getRuntime.availableProcessors,即当前CPU的核数。所以,在我的电脑上只有4个并发线程运行Future.

怎么改变Future的并发线程数?

1. 从上面的代码分析可以很容易想到,如果仍使用global ExecutionContext,修改系统变量即可:

  1. System.setProperty("scala.concurrent.context.minThreads", "8")
  2. System.setProperty("scala.concurrent.context.maxThreads", "8")

2. 更好的方法是重写一个自己的ExecutionContext。

  1. import java.util.concurrent.Executors
  2. import scala.concurrent._
  3. implicit val ec = new ExecutionContext {
  4. val threadPool = Executors.newFixedThreadPool(1000);
  5. def execute(runnable: Runnable) {
  6. threadPool.submit(runnable)
  7. }
  8. def reportFailure(t: Throwable) {}
  9. }

来自为知笔记(Wiz)

时间: 2024-08-07 00:42:52

Scala中Future的线程数的相关文章

用于Nagios中监控服务器进程的最大线程数

最近在刚好一些业务经常把线程跑满,导致服务器资源用完,所以就写了一个脚本用于Nagios下相关进程的最大线程数的监控,Unix的服务器上最大的线程数默认的是1024,当然在业务繁忙的服务器中这样肯定是不够用的,当然在实际生产环境中做初始化调优时一般都会有做过修改,如开启打开文件的最大句柄数等等,一般情况下我们都是修改/etc/security/limits.conf文件,但是要修改最大线程树就要修改/etc/security/limits.d/90-nproc.conf文件了,修改就和修改lim

java线程数过高原因分析

作者:鹿丸不会多项式  出处:http://www.cnblogs.com/hechao123   转载请先与我联系. 一.问题描述 前阵子我们因为B机房故障,将所有的流量切到了A机房,在经历了推送+自然高峰之后,A机房所有服务器都出现java线程数接近1000的情况(1000是设置的max值),在晚上7点多观察,java线程数略有下降,但还是有900+的样子,而此时,单台服务器的TPS维持在400/s,并不是一个特别大的量.然后将A机房一台机器下线,继续观察,到了晚上9点多,那台下线的机器,j

WINDOWS操作系统中可以允许最大的线程数

默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用

.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长

一个 asp.net core 站点,之前运行在Linux 服务器上,运行一段时间后有时站点会挂掉,在日志中记录很多“EMFILE too many open files”的错误: Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMFILE too many open files 后来将这个 asp.net 站点部署到 Windows 服务器的 IIS 上.运行一段时间后,发现其中一台

WINDOWS操作系统中可以允许最大的线程数(线程栈预留1M空间)(56篇Windows博客值得一看)

WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,

68:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析

今天给大家带来的是王家林老师的scala编程讲座的第68讲:Scala并发编程原生线程Actor.Cass Class下的消息传递和偏函数实战解析 昨天讲了Actor的匿名Actor及消息传递,那么我们今天来看一下原生线程Actor及CassClass下的消息传递,让我们从代码出发: case class Person(name:String,age:Int)//定义cass Class class HelloActor extends Actor{//预定义一个Actor  def act()

如何在 Linux 中统计一个进程的线程数

编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn/article-6240-1.html译者: strugglingyouth本文地址:https://linux.cn/article-6240-1.html 2015-9-17 10:29    收藏: 5 问题: 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会有多少线程

单个进程中最大线程数探索

[转载自http://blog.csdn.net/yohoph/article/details/48372805] windows 操作系统中允许的最大线程数. =========================================================================== 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个

180724-统计JVM进程中线程数两种方式小记

I. 统计进程中的线程数 相关系列博文推荐: 180711-JVM定位分析CPU性能消耗 180704-JDK常用监控参数 jvm调优的工具介绍 1. proc查询 /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU.中断.内存.磁盘等等 查看状态命令 cat /proc/进程号/status 其中对应的线程数为 Threads: 367 这一行 另外一种方式就是直接查看 /proc/进程号/task 下的目录,每个线程对应一个目录,目录名为对应的线程ID ls