科特林的协程是什么?

科特林的协程是什么?


协程是Kotlin语言提供的强大功能。 我已经尝试过了,我真的很喜欢它。


本文的目的是帮助您了解Corutins。 阅读时请小心,您将成功。


让我们从Corutin的正式定义开始。


协程是编写异步,非阻塞代码的新方法。

阅读此定义时出现的第一个问题是协程与流程有何不同?


协程是轻量级的流程。 轻量级线程意味着它不与本地线程绑定,因此不需要将上下文切换到处理器,因此速度更快。


“未附加到本机线程”是什么意思?


协程可以在许多编程语言中找到。


基本上,Corutin有两种类型:


  • 使用堆栈;
  • 不使用堆栈

Kotlin在没有堆栈的情况下实现了协程-这意味着协程没有自己的堆栈,因此它们不与本机线程绑定。


协程和流都是多任务的。 但是区别在于线程是由操作系统控制的,协程是用户。


现在,您可以有意识地阅读和理解Kotlin官方网站的摘录:


协程可以方便流动的形式表示。 像线程一样,协程可以并行工作,彼此等待并进行通信。 最大的区别是协程非常便宜,几乎是免费的:我们可以成千上万个协程创建它们,而性能却很少。 流很昂贵。 即使对于现代机器,一千个线程也可能是一个严重的问题。

让我们看看如何使用协同程序


那么,如何启动协程(类似于启动线程)?


启动协程有两个功能:


  • launch{}
  • async{}

在Kotlin Coroutines中启动{}与异步{}


区别在于launch{}返回任何内容,而async{}返回一个具有await()函数的Deferred实例,该函数返回协程的结果,就像Java中的Future一样,我们执行future.get()以获取结果。


让我们来看看使用启动{}


 fun main(args: Array<String>) { println("Kotlin Start") launch(CommonPool) { delay(2000) println("Kotlin Inside") } println("Kotlin End") } 

 // The output will be // Kotlin Start // Kotlin End // Kotlin Inside 

此代码将在此线程池中启动新的协程。 在这种情况下,我们使用CommonPool ,后者使用ForkJoinPool.commonPool() 。 在基于协程的程序中流仍然存在,但是一个线程可以运行很多协程,因此不需要太多线程。


让我们尝试一件事:


 fun main(args: Array<String>) { delay(2000) } 

如果直接在主函数中执行此操作,则会收到错误消息:


只能从协程或其他中断函数调用中断函数。


延迟函数是一个中断函数,因此我们只能从协程或其他中断函数调用它。


让我们解决这个问题:


 fun main(args: Array<String>) { runBlocking { delay(2000) } } 

另一个例子:


 suspend fun doWorkFor1Seconds(): String { delay(1000) return "doWorkFor1Seconds" } 

 suspend fun doWorkFor2Seconds(): String { delay(2000) return "doWorkFor2Seconds" } 

 // Serial execution private fun doWorksInSeries() { launch(CommonPool) { val one = doWorkFor1Seconds() val two = doWorkFor2Seconds() println("Kotlin One : " + one) println("Kotlin Two : " + two) } } 

 // The output is // Kotlin One : doWorkFor1Seconds // Kotlin Two : doWorkFor2Seconds 

现在让我们看看使用异步{}


 // Parallel execution private fun doWorksInParallel() { val one = async(CommonPool) { doWorkFor1Seconds() } val two = async(CommonPool) { doWorkFor2Seconds() } launch(CommonPool) { val combined = one.await() + "_" + two.await() println("Kotlin Combined : " + combined) } } // The output is // Kotlin Combined : doWorkFor1Seconds_doWorkFor2Seconds 

因为 async{}我们使用async{} ,因此可以调用await()来获取结果。


学习愉快;)

Source: https://habr.com/ru/post/zh-CN421473/


All Articles