Tag: 协程

如何通过reflection运行挂起方法?

有一个协程块可以运行暂停function。 但我通过reflectioninvoke函数。 这是java风格的调用,显然一个简单的调用是行不通的。 有没有办法异步运行reflection的方法? 如何等待这个方法? import kotlin.coroutines.experimental.* class TestClass(val InString: String) { suspend fun printString() { println(InString) } } fun launch(context: CoroutineContext, block: suspend () -> Unit) = block.startCoroutine(StandaloneCoroutine(context)) private class StandaloneCoroutine(override val context: CoroutineContext): Continuation { override fun resume(value: Unit) {} override fun resumeWithException(exception: Throwable) { val currentThread = Thread.currentThread() currentThread.uncaughtExceptionHandler.uncaughtException(currentThread, exception) } } […]

当使用kotlin协同程序时,如何对一个调用暂停function的函数进行unit testing?

我有这样的课 class SomeClass { fun someFun() { // … Some synchronous code async { suspendfun() } } private suspend fun suspendFun() { dependency.otherFun().await() // … other code } } 我想unit testingsomeFun()所以我写了一个unit testing,看起来像这样: @Test fun testSomeFun() { runBlocking { someClass.someFun() } // … verifies & asserts } 但是,这似乎不工作,因为runBlocking实际上并没有阻止执行,直到runBlocking内的一切完成。 如果我直接在runBlocking里面测试suspendFun()它可以像预期的那样工作,但是我想能够一起测试someFun() 。 任何线索如何测试同步和异步代码的function?

当几个协程运行时,不要退出Kotlin程序

在我的程序的几个地方,我使用launch来启动一个协同工作,做一些后台任务。 然后,在某个时候,我从main函数返回。 我的程序的简化版本可能如下所示: fun main(args : Array) { launch { delay(10000) // some long running operation println(“finished”) } } 现在,协程按预期启动并开始运行 – 然后程序退出。 如果我不从main返回或用thread替换launch ,一切都按预期工作。 所以我怎么能 ,因为我没有跟踪在我的程序中启动的所有协程(因此我不能使用.join()或.await() ), 确保所有的协程在我的程序退出之前完成?

Kotlin&Vertx&Mongo:如何管理异步CRUDfunction?

朋友们! 我是Vertx和Mongo的绿手,现在我面临一个棘手的问题。 以下是代码段。 这里是Mongo客户端的包装类。 // MongoDatabase.kt import io.vertx.core.json.JsonObject import io.vertx.core.logging.LoggerFactory import io.vertx.kotlin.core.json.JsonObject import io.vertx.rxjava.core.Vertx import io.vertx.rxjava.ext.mongo.MongoClient import kotlin.reflect.KClass import kotlin.reflect.full.declaredFunctions class MongoDatabase (val tClass: KClass, vertx: Vertx, config: JsonObject, databaseName: String) : Database { private val mongo = MongoClient.createShared(vertx, config, databaseName) private val logger = LoggerFactory.getLogger(MongoDatabase::class.java) // I use a self-made annotation to record the […]

协程(goroutines和kotlin协程)哪个更快?

Kotlin corutines是有限状态机和一些任务运行器(例如,默认的ForkJoinPool)的糖。 https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details 换句话说,在java / kotlin运行时中没有运行时协程(但是这可以通过http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html改变)。 Kotlin协同程序只是顺序执行的任务,逐个执行。 每个任务都可以在线程池中的任何线程中执行。 Go运行时支持“协同程序”。 但是goroutines不是真正的协程。 Goroutines不允许在程序中设置收益点。 另外,Go不允许设置自定义线程池。 您只能在默认池中设置线程的大小。 kotlin协程和goroutines之间的第一个区别是Go运行时管理此时正在运行的协程。 当某个IO操作(或同步原语)阻塞了goroutine时,选择下一个Job来执行它。 在JVM中,这种条件下没有智能的工作转换。 因此,Go可以便宜地更改当前正在运行的工作。 Go只需要更改一些registryhttps://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ 。 但有人说,JVM可以使用堆栈线程而不是使用寄存器。 所以根本没有保存和加载寄存器。 kotlin协程和goroutines之间的第二个区别是协程types。 Kotlin协程是无堆栈协程。 Goroutines是堆栈协程。 Kotlin协程的所有状态都存储在Kotlin上下文中,并存储在堆中。 Goroutines状态存储在寄存器和线程堆栈中。 我想知道哪些协程(goroutines和kotlin协程)在IO绑定任务中更快? CPU绑定任务? 内存消耗如何?

Kotlin协程中的“+”?

这是通过 Kotlin Coroutines的显式工作取消示例代码: fun main(args: Array) = runBlocking { val job = Job() // create a job object to manage our lifecycle // now launch ten coroutines for a demo, each working for a different time val coroutines = List(10) { i -> // they are all children of our job object launch(coroutineContext + job) […]