问题标签 [kotlin-coroutines]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
56777 浏览

java - 在 Java 中实现协程

这个问题与我对Java 中现有协程实现的问题有关。如果,正如我所怀疑的那样,Java 中目前没有完整的协程实现,那么实现它们需要什么?

正如我在那个问题中所说,我知道以下内容:

  1. 您可以在幕后将“协程”实现为线程/线程池。
  2. 您可以在幕后使用 JVM 字节码做一些棘手的事情,以使协同程序成为可能。
  3. 所谓的“达芬奇机器”JVM 实现具有使协程在没有字节码操作的情况下可行的原语。
  4. 也有各种基于 JNI 的协程方法。

我将依次解决每个人的不足之处。

基于线程的协程

这种“解决方案”是病态的。协程的重点是避免线程、锁定、内核调度等的开销。协程应该是轻量级和快速的,并且只在用户空间中执行。用严格限制的全倾斜线程来实现它们会消除所有优势。

JVM 字节码操作

这个解决方案更实用,尽管有点难以实现。这与跳入 C 中的协程库的汇编语言(这是其中有多少工作)大致相同,其优势在于您只需担心一种架构并正确处理。

它还将您限制在仅在完全兼容的 JVM 堆栈(这意味着,例如,没有 Android)上运行您的代码,除非您可以找到一种方法在不兼容的堆栈上执行相同的操作。但是,如果您确实找到了一种方法来做到这一点,那么您现在的系统复杂性和测试需求就会增加一倍。

达芬奇机器

达芬奇机器很适合实验,但由于它不是标准的 JVM,它的功能不会随处可用。事实上,我怀疑大多数生产环境都会明确禁止使用达芬奇机器。因此我可以用它来做很酷的实验,但不能用于我希望发布到现实世界的任何代码。

这还有一个类似于上面的 JVM 字节码操作解决方案的附加问题:无法在替代堆栈(如 Android 的)上工作。

JNI 实现

这个解决方案使在 Java 中执行此操作的意义完全没有实际意义。CPU 和操作系统的每种组合都需要独立测试,并且每种组合都可能导致令人沮丧的细微故障。或者,当然,我可以将自己完全束缚在一个平台上,但这也使得在 Java 中做事的意义完全没有意义。

所以...

有没有办法在不使用这四种技术之一的情况下在 Java 中实现协程?还是我会被迫改用这四种气味中最难闻的一种(JVM 操作)?


编辑添加:

只是为了确保包含混淆,这是一个与我的另一个相关的问题,但不一样。那个人正在寻找一个现有的实现,以避免不必要地重新发明轮子。这个问题与如果另一个证明无法回答,一个人将如何在 Java 中实现协程有关。目的是在不同的线程上保留不同的问题。

0 投票
6 回答
6721 浏览

android - 如何在主线程上使用 Kotlin 协程 await()

我刚开始学习 Kotlin 协程,并试图通过在 UI 上显示结果来模拟一些长时间的 API 调用:

我不明白我怎么可能在上下文中使用launch方法。main

不幸的是,我在coroutines 的官方教程中找不到任何关于为某些特定线程提供结果的信息。

0 投票
1 回答
3624 浏览

android - 有没有办法重用 Job 实例?

我正在探索在 Android UI 线程的上下文中使用协程。我按照Coroutines Guide UIcontextJob中的描述实现了。后台工作是从 GUI 开始的,我想在每次点击时重新启动它(停止当前正在运行的并重新启动它)。

但是一旦取消的工作就不能被重用,所以即使创建一个子工作:

并且取消它没有帮助,因为它必须重新分配。

有没有办法重用 Job 实例?

0 投票
2 回答
23281 浏览

kotlin - Kotlin 中线程和协程的区别

Kotlin 中是否有任何特定的语言实现,它与协程的其他语言实现不同?

  • 协程就像轻量级线程是什么意思?
  • 有什么区别?
  • kotlin 协程实际上是并行/并发运行的吗?
  • 即使在多核系统中,任何时候也只有一个协程在运行(对吗?)

这里我启动 100000 个协程,这段代码背后发生了什么?

0 投票
1 回答
4396 浏览

kotlin - 关闭 kotlinx.coroutines 频道的作用

使用 channel.close() 关闭 kotlinx.coroutines 通道有什么作用,不手动关闭通道的负面影响是什么?如果我不手动关闭频道会不会有一些不必要的处理?是否会在某处引用通道以防止其成为 GCd?还是关闭功能只是作为一种通知渠道的潜在用户它不能再使用的方式而存在。

(问题转自 Kotlin 论坛https://discuss.kotlinlang.org/t/closing-coroutine-channels/2549

0 投票
1 回答
873 浏览

android - 异步不等待等待

我是 Kotlin 和协程的新手。但是我想用它来初始化 Android ThreeTen backport library,这是一个长期运行的任务。我正在使用 Metalab Async/Await 库 ( co.metalab.asyncawait:asyncawait:1.0.0 )。

这是我的代码:

现在我遇到了初始化 UI 时没有初始化库的问题。根据我的理解initUI,不应该在被调用之前AndroidThreeTen.init调用。

0 投票
1 回答
2488 浏览

amazon-s3 - 通过 Kotlin 协程并发 S3 文件上传

我需要将许多文件上传到 S3,按顺序完成这项工作需要几个小时。这正是 Kotlin 的新协程擅长的地方,所以我想先尝试一下,而不是再摆弄一些基于线程的执行服务。

这是我的(简化的)代码:

问题:代码仍然很慢,日志显示请求仍然按顺序执行:一个作业在创建下一个作业之前完成。只有在极少数情况下(十分之一)我看到作业同时运行。

为什么代码不能更快/同时运行?我能做些什么呢?

0 投票
1 回答
1838 浏览

android - Anko coroutines kotlin 中的 Deferred 是什么?

在 kotlin 的 Anko 协程库中,有一个功能bg()可以轻松地在后台线程上执行代码。在那个返回类型中是Deferred。那么什么是延迟

参考链接

(1) https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Deferred.kt

(2) https://github.com/Kotlin/anko/wiki/Anko-Coroutines#bg

0 投票
4 回答
10010 浏览

kotlin - Kotlin 进程收集并行?

我有一组对象,我需要对其执行一些转换。目前我正在使用:

它工作正常,但我希望通过并行运行来加速它someMethod(),而不是等待每个对象完成,然后再开始下一个对象。

在 Kotlin 中有没有办法做到这一点?也许与doAsyncTask或什么?

我知道一年多前有人问这个问题时这是不可能的,但是现在 Kotlin 有协程,doAsyncTask我很好奇协程是否可以提供帮助

0 投票
1 回答
1930 浏览

android - Kotlin 协程不等待完成

我有一个遗留项目,我想在联系后端时使用协程。后端由 Hybris 提供的 sdk 处理。例如,它使用 volley,并带有一些回调。我想要的是用协程包装这些回调。但我遇到的问题是协程不等待完成,它启动协程,并继续下一行,方法返回一个值,然后协程完成很久。我的代码:

辅助方法:

以及调用协程的位置:

所以不是等待serviceHelper.wishLists().await()完成,而是返回列表。我也尝试让该方法返回 a runBlocking{},但这只会阻止 UI 线程并且不会结束协程。