问题标签 [kotlinx.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 投票
1 回答
98 浏览

kotlin - 有没有办法使用协程获得 FixedTreadPool 行为?

有没有办法获得与下面的代码片段相同的行为但使用协程?

更新的代码片段:

如何以并行因子 == 50 运行 300 个作业,但不创建 50 个真实线程?

更新 2:解决方案

再次阅读Coroutines Guide后,我发现Fan-out 示例正是我想要的。因此,我的示例如下所示:

0 投票
1 回答
900 浏览

android - Kotlin 协程使用 mockito 进行单元测试

当我尝试模拟和验证调用挂起函数的活动时,我得到以下信息

错误:

论据不同!通缉:userManager.getAccountInfo((onCreate_callsGetAccountInformation$1) kotlinx.coroutines.experimental.CoroutineScope.() -> kotlin.Unit); -> at com.pharmacy.AccountActivityTests$onCreate_callsGetAccountInformation$1.doResume(AccountActivityTests.kt:117) 实际调用有不同的参数:userManager.getAccountInfo(() kotlinx.coroutines.experimental.CoroutineScope.() -> kotlin.Unit) ->在 com.pharmacy.AccountActivity$loadAccountInfoAsync$1$1.doResume(AccountActivity.kt:199)

代码:

我的单元测试用例用 runBlocking 装饰,如下所示:

这里 -> usermanager.getAccountInfo() 是一个挂起函数。

0 投票
1 回答
917 浏览

kotlin - Kotlin协程中的“+”?

这是Kotlin Coroutines通过显式作业取消的示例代码:

+对表达感到困惑coroutineContext + job

它在做什么?是运算符覆盖吗?

0 投票
2 回答
3593 浏览

multithreading - 使用 Kotlin 协程的多线程

我正在试验Kotlin Coroutines并有以下代码:

这是我的输出:

根据 Roman Elizarov对另一个协程相关问题的回答:

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

根据 Java 8文档

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

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

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

0 投票
1 回答
905 浏览

android - Kotlin 协程使用生产和模拟来模拟生产工作

我正在我的 Android 应用程序中测试 Kotlin 协程,并且我正在尝试进行以下单元测试

交互器方法如下

postExecute{..}是一个BaseInteractor在 ui 线程中通过自定义 Executor 执行函数的方法,该 Executor 使用launch(UI)来自 kotlin android coroutines library的 coroutine

然后该repository.getVenues(..)函数也是一个协程,它使用返回 ProducerJobproduce(CommonPool) {}

问题是它似乎没有按照交互函数中的成功回调执行

但是,我在调试时确实看到交互器函数中的执行到达了if (venues.isEmpty())内部的行,consumeEach但随后从那里退出并继续测试,显然在验证成功回调时失败。

我对协程有点新,所以任何帮助都将不胜感激。

0 投票
1 回答
110 浏览

kotlin - `SendChannel.offer`、`CompletableDeferred.complete` 等可以在协程之外调用吗?

CompletableDeferred文件说

此接口上的所有函数以及从它派生的所有接口上的所有函数都是线程安全的,并且可以从并发协程安全地调用而无需外部同步。

在任何协程之外调用这些函数是否安全?

For SendChannel<E>, offerand closeare notsuspend等它们在语法上可以在协程之外调用,但这样做真的安全吗?

如果需要协程,最便宜的启动方式是什么launch(Unconfined)

0 投票
1 回答
331 浏览

kotlin - 如何最好地等到演员在 kotlinx.coroutines 0.20 中停止?

在 kotlinx.coroutines 0.19 中,可以编辑的actor返回值:ActorJobjoin

在 0.20 中,它更改为 return SendChannel。查看实现,它仍然返回一个扩展类的实例Job,所以我可以

但这是一种明显的代码气味。有更好的选择吗?

0 投票
7 回答
7063 浏览

multithreading - 如何限制 kotlin 协程的最大并发性

我有一个序列(来自 File.walkTopDown),我需要在每个序列上运行一个长时间运行的操作。我想使用 Kotlin 最佳实践/协程,但我要么没有并行性,要么并行性太多,并遇到“打开文件太多”的 IO 错误。

这似乎不能并行运行,而且我的多核 CPU 永远不会超过 1 个 CPU 的价值。协程有没有办法运行“NumberOfCores 并行操作”的延迟作业?

我查看了使用 Kotlin Coroutines 的多线程,它首先创建所有作业然后加入它们,但这意味着在繁重的处理加入步骤之前完成序列/文件树遍历,这似乎...... 将其拆分为收集和处理步骤意味着收集可以在处理之前运行。

0 投票
1 回答
878 浏览

android - UI线程上的单元测试协程

我正在使用协程对拉动进行异步调用以刷新,如下所示:

当我实际将它放在设备上时,这里的一切都很好。我的错误、空、数据状态都处理的很好,性能也不错。但是,我也在尝试使用 Spek 对其进行单元测试。我的 Spek 测试如下所示:

测试失败,因为它说没有与uut?.swipeRefreshLayout模拟交互。经过一些试验,这似乎是因为我通过async(UI). 如果我让它只是一个常规的异步,我可以让测试通过,但是应用程序崩溃了,因为我正在修改 UI 线程之外的视图。

任何想法为什么会发生这种情况?另外,如果有人对此有任何更好的建议,这将使其更具可测试性,我会全力以赴。

谢谢。

编辑:忘了提到我也尝试将verifyand包装uut?.onRefresh()在 a 中runBlocking,但我仍然没有成功。

0 投票
2 回答
2399 浏览

android - Kotlin coroutine swallows exception

I'm very confused about how Exception handling works with coroutines.

I was hoping that it would be possible to have a chain of suspend functions that would pass Exceptions between themselves like synchronous code. So if say Retrofit threw an IOException, I could handle that exception at the beginning of the chain of suspend functions such as in a presenter to show an error to a user.

I made this simple example to try out coroutines but if I uncomment either throw Exception call the code after the Exception fails to run but the Exception does not crash the app.

I have tried using async and CoroutineExceptionHandler.