使用 Kotlin 协程进行多线程

2024-03-01

我正在尝试Kotlin 协程 https://kotlinlang.org/docs/reference/coroutines.html并有以下代码:

fun main(args: Array<String>) = runBlocking {
    val cores = Runtime.getRuntime().availableProcessors()
    println("number of cores: $cores")

    val jobs = List(10) {
        async(CommonPool) {
            delay(100)
            println("async #$it on thread ${Thread.currentThread().name}")
        }
    }
    jobs.forEach { it.join() }
}

这是我的输出:

number of cores: 4
async number:0 on thread ForkJoinPool.commonPool-worker-2
async number:2 on thread ForkJoinPool.commonPool-worker-3
async number:3 on thread ForkJoinPool.commonPool-worker-3
async number:4 on thread ForkJoinPool.commonPool-worker-3
async number:5 on thread ForkJoinPool.commonPool-worker-3
async number:1 on thread ForkJoinPool.commonPool-worker-1
async number:7 on thread ForkJoinPool.commonPool-worker-3
async number:6 on thread ForkJoinPool.commonPool-worker-2
async number:9 on thread ForkJoinPool.commonPool-worker-3
async number:8 on thread ForkJoinPool.commonPool-worker-1

根据罗曼·伊利扎罗夫的说法answer https://stackoverflow.com/a/43232925/3734457另一个与协程相关的问题:

“启动只是创建了新的协程,而 CommonPool 则调度 ForkJoinPool.commonPool() 的协程确实使用多个 线程,因此在此示例中在多个 CPU 上执行。”

根据Java 8文档 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html:

“对于需要单独或自定义池的应用程序, ForkJoinPool 可以用给定的目标并行度级别构建; 默认情况下,等于可用处理器的数量。”

为什么只使用了 3 个工作线程?即使我将异步任务数量增加到 1000+,仍然有 3 个工作线程。

我的配置: Mac/High Sierra 带双核 cpu(带超线程 https://en.wikipedia.org/wiki/Hyper-threading,因此有 4 个可见核心)、Kotlin 1.2、kotlinx-coroutines-core:0.19.3 和 JVM 1.8


如果你看一下实施CommonPool https://github.com/Kotlin/kotlinx.coroutines/blob/master/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/CommonPool.kt,你会注意到它正在运行java.util.concurrent.ForkJoinPool或具有以下大小的线程池:

(Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)

With 4可用的处理器,这将导致3这回答了为什么你会看到 3 个工作线程。

The ForkJoinPool-size 可以确定如下(将相同):

ForkJoinPool.commonPool().parallelism

请参见这个答案 https://stackoverflow.com/a/53157947/8073652如果您使用的协程版本 >= 1.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Kotlin 协程进行多线程 的相关文章

  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 报告线程进度的最佳方式

    我有一个程序 它使用线程顺序执行耗时的进程 我希望能够监视每个线程的进度 类似于BackgroundWorker ReportProgress ProgressChanged模型确实如此 我不能使用ThreadPool or Backgro
  • 匹配集合 Parallel.Foreach

    我正在尝试为 matchcollection 创建一个 Parallel Foreach 循环 它在我构建的刮刀中 我只需要知道在 Parallel Foreach 中放入什么 MatchCollection m Regex Matches
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没
  • KDoc:插入代码片段

    如何在 Kotlin 的默认文档工具 KDoc 中插入代码片段 在 Java 中 我可以使用以下内容 Example usage pre code 64 JavaAnnotation public void foo Code code pr
  • 确保 Clojure 中只有一个服务实例正在运行/启动/停止的规范方法?

    我正在用 Neo4j 支持的 Clojure 编写一个有状态服务器 它可以服务套接字请求 例如 HTTP 当然 这意味着我需要能够从该服务器内启动和停止套接字服务器 在设计方面 我希望能够在此服务器中声明一个 服务 并启动和停止它 我在 C
  • System.InvalidCastException:指定的强制转换无效

    使用 WatiN 的自动化正在进行中 使用几个并发线程来测试应用程序 很少有线程失败 日志报告 堆栈跟踪显示以下内容 System InvalidCastException Specified cast is not valid at SH
  • 无法为对象堆保留足够的空间

    每次尝试运行该程序时 我都会重复出现以下异常 VM初始化期间发生错误 无法为对象堆保留足够的空间 无法创建Java虚拟机 我尝试增加虚拟内存 页面大小 和 RAM 大小 但无济于事 我怎样才能消除这个错误 运行 JVM XX MaxHeap
  • 根据另一个列表的顺序对列表进行排序[重复]

    这个问题在这里已经有答案了 我需要对列表进行排序Person对象 List
  • 为什么我的多螺纹嵌件比单螺纹嵌件性能更好?

    我调查了并发性 http docs mongodb org manual faq concurrency how granular are locks in mongodb在 MongoDB 中 显然它使用了数据库级锁定系统 我认为这意味着
  • 带有管理等待的 Gui 可重入

    我在使用 NotifyIcons 时发现了重入问题 重现起来非常简单 只需将 NotiftIcon 放在表单上 单击事件应如下所示 private bool reentrancyDetected private void notifyIco
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • 什么是竞争条件?

    编写多线程应用程序时 最常见的问题之一是竞争条件 我向社区提出的问题是 竞赛条件是什么 你如何检测它们 你如何处理它们 最后 如何防止它们发生 当两个或多个线程可以访问共享数据并且它们试图同时更改它时 就会出现竞争条件 由于线程调度算法可以
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 如何运行 Kotlin REPL kotlinc-jvm 或 kotlinc

    我对 Kotlin 完全陌生 我正在尝试运行 Kotlin REPL 下列的this https kotlinlang org docs tutorials command line html running the repl 考虑到我使用
  • 是否可以在Java中检查CPU是否是超线程的?

    我想知道可以运行的最佳线程数 通常 这等于Runtime getRuntime availableProcessors 但是 在支持超线程的 CPU 上 返回的数字是其两倍 现在 对于某些任务来说 超线程是好的 但对于其他任务来说 它没有任
  • “_Smi”不是“bool”类型的子类型 - Flutter MethodChannel

    收到这个奇怪的错误 似乎 MethodChannel 正在转换为 int 而不是 bool 06 07 00 16 26 589 3678 4993 E flutter ERROR topaz lib tonic logging dart
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐

  • 画布下方的白色空白区域

    花了几个小时摆弄代码后 我遇到了一个问题 我创建了一个灰色的 HTML 画布 它将填满整个屏幕 并且它起作用了 但是 即使画布应该是屏幕上唯一可见的对象 当我向下滚动时 页面底部似乎仍然有一个小的白色空白区域 我已经知道这与身体无关 因为我
  • 在框架内打开 https 页面是否存在问题

    我以编程方式创建一个 html 报告 分为两个框架 如果用户随后单击右侧框架上的超链接 则该框架将被页面内容替换 这工作正常 但现在当我尝试链接到任何 Discogs 发布页面时 例如this one https www discogs c
  • 帮助解决密码复杂性正则表达式

    我使用以下正则表达式来验证密码复杂性 6 12 0 9 2 A Z 2 a z 2 简而言之 2个小写字母 2个大写字母 2个数字 最小长度为6 最大长度为12 当我使用最小长度时 除了最大长度之外 它工作得很好 例如 6 0 9 2 A
  • oracle sql 日期不晚于今天

    我需要显示一些数据 如果它是 新数据 更新数据 比方说 我将从发布日期列和更新列中获取这些数据 其中发布日期和更新日期都是时间戳 那么如果是新的日期如何计算呢 过去 24 小时 Where publish date gt sysdate 1
  • Python 中的 Yaml 合并

    所以我正在考虑用 Python 为 Pygame 制作一个小样板库 当然还有任何愿意使用它的人 我想要一个通过 yaml 文件提供应用程序设置的系统 因此 我认为如果库提供默认的 yaml 树并将其与用户提供的树合并 将会很有用 为了可用性
  • 如何同时运行 Windows Phone 7 模拟器的多个实例?

    我正在为 Windows Phone 7 创建多人游戏 如何运行模拟器的多个实例来调试它 您确实可以同时运行 Windows Phone 7 模拟器的多个实例 甚至可以同时调试它们 如我在我的文章中所示博客文章 http blog func
  • shell脚本中的cd命令是否加载目标目录中的rvmrc?

    当你有类似 在projectx内部给出一个 rvmrc文件 指定ruby 1 9 2并且我的系统上有两个ruby ree 1 8 7和ruby1 9 2 bin bash cd applications projectx which rub
  • flex-flow:列换行,在弹性框中导致父容器溢出

    我有这样的场景 https jsfiddle net b6zcdgf7 https jsfiddle net b6zcdgf7 container display flex height 3em border solid thin blue
  • H2数据库用户定义的java函数类未找到

    当我创建一个 ALIAS 来在 H2 数据库中注册 java 函数时 它给出了未找到类的错误 我正在 TCP 连接上运行 h2 数据库 sample public class TimeFrame public static void mai
  • 如何从 Java 将焦点集中到 shell 打开文件的默认程序?

    在 Java 中 我使用默认文件处理程序 MS Excel 在本例中 打开一个 Excel 文件 使用中描述的方法这个计算器问题 https stackoverflow com questions 2114318 opening an ex
  • 在 C# 中,如何捕获 Web 服务调用中使用的 SOAP?

    我有一个 C 应用程序 它是 Web 服务的客户端 我的要求之一是允许捕获我发送的 SOAP 这样如果出现问题 我可以修复错误 或者证明问题出在我正在调用的服务中 我的 WebReference 代理服务类派生自System Web Ser
  • NodeJS - MongoDB 触发器

    我正在尝试使用 DerbyJS Racer 和 MongoDB 开发日志查看器 日志将由不同的源连续插入到 MongoDB 数据库中 我的日志查看器应该能够自动更新用户界面上的日志表 我想知道是否有一种本地方式来监听 MongoDB 事件
  • libgdx 中的抗锯齿填充形状

    我一直在到处寻找一种方法来消除用绘制的填充形状的边缘锯齿ShapeRenderer ie ShapeType Filled 但找不到任何关于此的信息 线条效果很好Gdx gl glEnable GL10 GL LINE SMOOTH 但我尝
  • Python 的 pbkdf2_sha256.verify 的 NodeJS 实现

    我必须将此 Python 代码翻译为 NodeJS from passlib hash import pbkdf2 sha256 pbkdf2 sha256 verify 12345678 pbkdf2 sha256 2000 8R7jHO
  • Code::blocks 中的调试器命令行参数

    在 Code blocks 中调试程序时 如何指定要发送到正在调试的程序的命令行参数 我一生都找不到在哪里设置它 谷歌搜索会显示用于调试编译器本身的设置 而不是编译器中编写的程序 如果把它排除在外 那就太奇怪了 Thanks Tim 啊 正
  • VSCode Prettier 以奇怪的方式格式化 HTML(下一行大于符号)

    从今天起 安装了 Prettier Extension 的 VSCode 以一种非常奇怪的方式格式化我的 HTML 例如
  • LINQ to XML 提取嵌套元素

    我对 LINQ 和 XML 解析很陌生 对 C 编程也很陌生 对于以下 XML 结构 我尝试提取嵌套元素
  • 如何在 Windows 7 中使用 Cygwin 安装 git-subtree?

    我正在努力使用 Cygwin 安装 git subtree 并且网上没有任何专注于从 Windows 源代码构建的好的教程 您是否遇到过这个问题 解决这个问题的最佳策略是什么 git subtree不是包的一部分 然而 就像gitk你可以手
  • Oracle To_Char函数如果已经是字符串如何处理

    场景 我正在调用一个函数 该函数返回用户输入的字段 该字段通常返回一个类似 120000 的数字 然后我使用 to char 将其转换为 120 000 问题 某些用户输入 120 000 等值 这在尝试使用 to char 时出现错误 如
  • 使用 Kotlin 协程进行多线程

    我正在尝试Kotlin 协程 https kotlinlang org docs reference coroutines html并有以下代码 fun main args Array