Questions tagged «kotlin-coroutines»

Kotlin 1.3中引入的一种语言功能和一个库,用于实现“绿色线程”模型。它允许自然地编写非阻塞IO代码,而无需诉诸期货或回调。


6
暂停功能在Kotlin Coroutine中意味着什么
我正在阅读Kotlin Coroutine,并且知道它基于suspend功能。但是什么suspend意思呢? 协程或功能被暂停? 来自https://kotlinlang.org/docs/reference/coroutines.html 基本上,协程是可以在不阻塞线程的情况下挂起的计算 听说人们经常说“暂停功能”。但我认为是协程被暂停,因为它正在等待功能完成?“挂起”通常表示“停止操​​作”,在这种情况下,协程空闲。 🤔我们应该说协程暂停了吗? 哪个协程被暂停? 来自https://kotlinlang.org/docs/reference/coroutines.html 为了继续类推,await()可以是一个暂停函数(因此也可以从async {}块内调用),该例程可以暂停协程直到完成一些计算并返回其结果: async { // Here I call it the outer async coroutine ... // Here I call computation the inner coroutine val result = computation.await() ... } says它说“挂起协程直到完成计算”,但是协程就像轻量级线程。因此,如果协程被挂起,如何进行计算? 我们看到await被调用了computation,所以可能是asyncreturn Deferred,这意味着它可以启动另一个协程 fun computation(): Deferred<Boolean> { return async { true } } …

3
Kotlin:withContext()与异步等待
我一直在阅读kotlin文档,如果我正确理解了两个Kotlin函数,则它们的工作方式如下: withContext(context):切换当前协程的上下文,当执行给定的块时,协程切换回先前的上下文。 async(context):在给定的上下文中启动一个新的协程,如果我们调用.await()返回的Deferred任务,它将暂停正在调用的协程,并在派生的协程内部执行的块返回时恢复。 现在针对以下两个版本code: 版本1: launch(){ block1() val returned = async(context){ block2() }.await() block3() } 版本2: launch(){ block1() val returned = withContext(context){ block2() } block3() } 在这两个版本中,block1(),block3()在默认context(commonpool?)中执行,而block2()在给定上下文中执行。 整体执行与block1()-> block2()-> block3()顺序同步。 我看到的唯一区别是,版本1创建了另一个协程,而版本2在切换上下文时仅执行一个协程。 我的问题是: 是不是总是更好地使用withContext,而不是async-await因为它的功能类似,但不会创建另一个协程。大量的协程,尽管很轻巧,但在苛刻的应用中仍然可能是一个问题。 有没有比这async-await更好的情况了withContext? 更新: Kotlin 1.2.50现在具有可在其中转换的代码检查async(ctx) { }.await() to withContext(ctx) { }。


2
Kotlin中的线程和协程之间的区别
Kotlin中是否有任何特定的语言实现方式与协程的其他语言实现方式不同? 什么是协程像轻质螺纹? 有什么不同? Kotlin协程是否实际上并行/并发运行? 即使在多核系统中,在任何给定时间都只有一个协程运行(对吗?) 在这里,我要启动100000个协程,这段代码后面会发生什么? for(i in 0..100000){ async(CommonPool){ //run long running operations } }

7
用Java实现协程
这个问题与我有关Java中现有协程实现的问题有关。如我所怀疑的,如果事实证明Java中没有可用的协程的完整实现,那么实现它们将需要什么? 正如我在这个问题中所说的,我了解以下内容: 您可以将“协程”实现为后台的线程/线程池。 您可以在后台使用JVM字节码来完成棘手的事情,以使协程成为可能。 所谓的“达芬奇机” JVM实现具有使协程在无需字节码操作的情况下就可以实现的原语。 也有多种基于JNI的协程方法。 我将依次解决每个人的不足之处。 基于线程的协程 这种“解决方案”是病态的。协程的全部目的是避免线程,锁定,内核调度等开销。协程应该轻巧,快速,并且只能在用户空间中执行。根据具有严格限制的全倾斜线程来实现它们会失去所有优势。 JVM字节码操作 此解决方案更实用,尽管很难实现。这大致相当于跳入C语言中的协程库的汇编语言(这是其中的许多工作原理),其优点是您只需要担心一种架构即可。 除非您找到在不兼容的JVM堆栈上执行相同操作的方法,否则还将使您只能在完全兼容的JVM堆栈(例如,没有Android)上运行代码。但是,如果确实找到了解决方法,那么您现在已经将系统复杂性和测试需求提高了一倍。 达芬奇机 达芬奇机很酷,可以进行实验,但是由于它不是标准的JVM,因此它的功能不会在任何地方都可用。实际上,我怀疑大多数生产环境都将特别禁止使用达芬奇机器。因此,我可以使用它来进行出色的实验,但不能用于我希望发布到现实世界中的任何代码。 这也具有类似于上面的JVM字节码操作解决方案的附加问题:在替代堆栈(如Android的堆栈)上将不起作用。 JNI实施 这种解决方案完全没有用Java来做到这一点。CPU和操作系统的每种组合都需要独立的测试,并且每一个都是潜在的令人沮丧的细微故障点。另外,当然,我可以将自己完全束缚在一个平台上,但这也使得在Java中做事情完全没有意义。 所以... 是否可以在不使用这四种技术之一的情况下用Java实现协程?还是我会被迫使用气味最小的那四种(JVM操作)中的一种? 编辑添加: 只是为了确保避免混淆,这是与我的另一个相关的问题,但并非相同。为了避免不必要地重新发明轮子,那个人正在寻找现有的实现。这个问题涉及一个问题,即如果另一个问题无法解决,如何在Java中实现协程。目的是在不同的线程上保留不同的问题。


3
Kotlin Flow与Android LiveData
我对Kotlin Flow有一些疑问 我可以从多个片段观察LiveData。我可以用Flow做到这一点吗?如果是,那怎么办? 我们可以使用map&从单个LiveData获得多个LiveData switchMap。有没有办法从一个源流获得多个流? 使用,MutableLiveData我可以使用变量引用从任何地方更新数据。有什么办法可以对Flow进行同样的操作? 我有一个用例这样的:我会观察SharedPreferences使用callbackFlow{...},这将给我一个单一源流。从该流中,我想为每个键值对创建多个流。 这些听起来很愚蠢。我是Rx and Flow世界的新手。

3
withTimeout函数提供IllegalStateException:没有事件循环。使用runBlocking {…}启动一个。在Kotlin Multiplatform iOS客户端中
更新:如果我先执行没有超时的协程,然后执行withTimeout,它将起作用。但是,如果我先用timeout执行协程,则会给我一个错误。异步也是如此。 我正在创建一个演示kotlin跨平台应用程序,并在其中使用ktor执行API调用。我想在ktor请求上具有可配置的超时功能,所以我在协程级别使用withTimeout。 这是我使用网络API进行的函数调用。 suspend fun <T> onNetworkWithTimeOut( url: String, timeoutInMillis: Long, block: suspend CoroutineScope.() -> Any): T { return withTimeout(timeoutInMillis) { withContext(dispatchers.io, block) } as T } suspend fun <T> onNetworkWithoutTimeOut(url: String, block: suspend CoroutineScope.() -> Any): T { return withContext(dispatchers.io, block) as T } 这是我的iOSMain模块的AppDispatcher类。 @InternalCoroutinesApi actual class AppDispatchersImpl …

2
Kotlin Flow与LiveData
在上一个Google I / O中,Jose Alcerreca和Yigit Boyar 告诉我们,我们不再应该使用LiveData来获取数据。现在,我们应该将暂停功能用于一次抓取,并使用Kotlin的Flow创建数据流。我同意协程对于单次获取或其他CRUD操作(例如插入等)非常有用。但是,在需要数据流的情况下,我不了解Flow给我带来什么好处。在我看来,LiveData也在这样做。 流示例: 视图模型 val items = repository.fetchItems().asLiveData() 资料库 fun fetchItems() = itemDao.getItems() 道 @Query("SELECT * FROM item") fun getItems(): Flow<List<Item>> LiveData示例: 视图模型 val items = repository.fetchItems() 资料库 fun fetchItems() = itemDao.getItems() 道 @Query("SELECT * FROM item") fun getItems(): LiveData<List<Item>> 我还希望看到一些使用协程和Flow与Room或Retrofit协同工作的项目示例。我只找到了一个Google的ToDo示例,其中协程用于一次获取,然后在更改时手动重新获取数据。

2
Kotlin协程“事前发生”的保证?
Kotlin协程是否提供任何“事前保证”? 例如,mutableVar在这种情况下,对(可能)其他线程的写入和后续读取之间是否存在“先于后继”保证: suspend fun doSomething() { var mutableVar = 0 withContext(Dispatchers.IO) { mutableVar = 1 } System.out.println("value: $mutableVar") } 编辑: 也许还有其他例子可以更好地阐明这个问题,因为它更具Kotlin风格(可变性除外)。这段代码是线程安全的吗: suspend fun doSomething() { var data = withContext(Dispatchers.IO) { Data(1) } System.out.println("value: ${data.data}") } private data class Data(var data: Int)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.