Day 1:同步与非同步执行

Hi 各位好,又到了我们一年一度的 iT邦铁人赛的挑战,这次我所挑战的主题是 Kotlin 中用来处理非同步的 lib Coroutine,中文名称「协程」,是与 Kotlin 1.3 版一起推出的一个函式库,正式版推出时间距今已经快要有三年的时间,目前在 github 也已经累积 9.7k 颗星。

Coroutine 推出之後,很多 Kotlin 开发者开始使用 Coroutine,究竟 Coroutine 有什麽样的魅力,可以让 Kotlin 开发者对 Coroutines 趋之若鹜呢?

在三十天中,我们将会一一讨论 Coroutine,包括 CoroutineScope、Coroutine Builder、Suspend function、channel、flow... 。


前言

在开始进行 Coroutine 的讨论之前,我们要先来了解 Coroutine 是要用来解决什麽问题。(文末解答XD)

首先,根据程序的执行顺序可以分为两种形式,一种是同步 (Synchronous)的、另一种为非同步(Asynchronous),也称为异步。

同步

同步是根据程序码的顺序来执行。同步的程序是容易的、直觉的,只要将程序码按照想要执行的顺序依序编写就可以了。
同步程序图

如上, 用同步的方式依序执行三段程序,程序的执行时间就会是 function A 所执行的时间+ function B 所执行的时间 + function C 所执行的时间。一段程序执行完之後,才会执行下一段程序。

这就像是田径场上的接力赛的感觉,一棒接一棒。

https://media.giphy.com/media/glqdZPHSpcMNTbhCxs/giphy.gif

非同步

非同步的概念则是与同步相异,程序码不是依照程序码的顺序来执行并得到结果。当需要执行的程序需要比较多的时间,为了避免卡住画面,会将程序码在另外的执行绪上执行,等到完成之後告诉主执行绪、又或者是不知道什麽时候可以取得结果(例如与 Server 取值)。

如下图,向 Server 取值的时序图:

当 Client 向 Server 发出一个请求时,因为是采用非同步的方式执行,所以在发出请求之後,还可以做其他的操作,Client 不会卡在那边等 Server 的值回传。

Server 取值时序图

若改用同步的方式来实现,执行时序图如下:

Server 取值时序图(同步)

可以发现,如果采用同步的方式来取 Server 的值,假设 API 需要花费比较长的时间才会得到结果,那麽用户端就会卡在那边,等待 Server 的回传值,更不用说如果等待的时间拉长,会严重影响使用的体验。在 Android 上,只要主执行绪 (Main Thread) 停住五秒钟以上,就会显示 ANR (Application Not Response)来警告使用者。

所以当执行这些结果不是立刻取得的任务时,为了避免不会因执行太久、等待太久而导致使用者使用体验不好,我们会使用非同步的方式来处理。

简单来说,非同步的概念就是我请别人帮忙做事,别人做完之後再通知我。那麽这样子就不会占用到主执行绪,当然如果非同步执行的程序需要花费很多时间,非同步应该要可以随时被停止,Coroutine 在这一点就做得蛮好的。

除了耗时任务以外,有些时候我们需要延迟执行我们的程序,也就是说当我们呼叫的时候这段程序码不会立刻执行,而是等待一段时间才继续执行,并回传结果,

Coroutine 要解决的问题

介绍了同步以及非同步的差异,聪明的读者你应该已经猜到了,没错,Coroutine 就是用来解决非同步的种种问题。

心智图

同步与非同步的心智图


特别感谢

Kotlin Taiwan User Group
Kotlin 读书会


<<:  从零开始学习3D游戏开发:程序基础 Part.3 回圈

>>:  .Net Core Web Api_笔记06_HTTP资源操作模式Head

C 信号管道SIGPIPE问题

最近设计一个回圈收发电文 步骤大概为 1.与公司主机建立连线 2.收取公司电文讯息 3.发出自建电文...

{CMoney战斗营} 的第七周 # 勉强堪用(?)的重力系统

本周的目标是要让横向卷轴中的角色可以左右移动及跳跃, 在没有碰到场景物件时自由落体, 碰到墙壁时被...

【Day 06】LeetCode:Two Sum ( 用 JavaScript 学演算法 )

我们继续透过 LeetCode #1 Two Sum 来实际感受解决问题的过程 ( 题目连结 ) 一...

连续 30 天 玩玩看 ProtoPie - Day 17

突然意识到,其实正确的学法,应该更直接去看看别人怎麽做。 立刻发现,ProtoPie 已经整理了一些...

[day 17] Swift 语法梳理後续

Swift 语法介绍 枚举(Enumerations) ,类和结构体 枚举(Enumerations...