chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kotlin協(xié)程實(shí)戰(zhàn)進(jìn)階之筑基篇1

jf_78858299 ? 來(lái)源:小余的自習(xí)室 ? 作者:蘇火火 ? 2023-05-30 16:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

公司開(kāi)啟新項(xiàng)目了,想著準(zhǔn)備亮一手 Kotlin 協(xié)程應(yīng)用到項(xiàng)目中去,之前有對(duì) Kotlin 協(xié)程的知識(shí)進(jìn)行一定量的學(xué)習(xí),以為自己理解協(xié)程了,結(jié)果……實(shí)在拿不出手!

為了更好的加深記憶和理解,更全面系統(tǒng)深入地學(xué)習(xí) Kotlin 協(xié)程的知識(shí),協(xié)程將分為三部分來(lái)講解,本文是第一篇

一、概述

協(xié)程的概念在1958年就開(kāi)始出現(xiàn)(比線程還早), 目前很多語(yǔ)言開(kāi)始原生支, Java 沒(méi)有原生協(xié)程但是大型公司都自己或者使用第三方庫(kù)來(lái)支持協(xié)程編程, 但是Kotlin原生支持協(xié)程。

Android 中的每個(gè)應(yīng)用都會(huì)運(yùn)行一個(gè)主線程,它主要是用來(lái)處理 UI,如果主線程上需要處理的任務(wù)太多,應(yīng)用就感覺(jué)被卡主一樣影響用戶體驗(yàn),得讓那些耗時(shí)的任務(wù)不阻塞主線程的運(yùn)行。要做到處理網(wǎng)絡(luò)請(qǐng)求不會(huì)阻塞主線程,一個(gè)常用的做法就是使用回調(diào),另一種是使用協(xié)程。

協(xié)程概念

很多人都會(huì)問(wèn)協(xié)程是什么?這里引用官方的解釋?zhuān)?/p>

1.協(xié)程通過(guò)將復(fù)雜性放入庫(kù)來(lái)簡(jiǎn)化異步編程。程序的邏輯可以在協(xié)程中順序地表達(dá),而底層庫(kù)會(huì)為我們解決其異步性。該庫(kù)可以將用戶代碼的相關(guān)部分包裝為回調(diào)、訂閱相關(guān)事件、在不同線程(甚至不同機(jī)器)上調(diào)度執(zhí)行,而代碼則保持如同順序執(zhí)行一樣簡(jiǎn)單。

2.協(xié)程是一種并發(fā)設(shè)計(jì)模式。

協(xié)程就像輕量級(jí)的線程,為什么是輕量的?因?yàn)閰f(xié)程是依賴于線程,一個(gè)線程中可以創(chuàng)建N個(gè)協(xié)程, 很重要的一點(diǎn)就是協(xié)程掛起時(shí)不會(huì)阻塞線程 ,幾乎是無(wú)代價(jià)的。而且它 基于線程池API ,所以在處理并發(fā)任務(wù)這件事上它真的游刃有余。

協(xié)程只是一種概念,它提供了一種避免阻塞線程并用更簡(jiǎn)單、更可控的操作替代線程阻塞的方法: 協(xié)程掛起和恢復(fù) 。 本質(zhì)上Kotlin協(xié)程就是作為在Kotlin語(yǔ)言上進(jìn)行異步編程的解決方案,處理異步代碼的方法 。

有可能有的同學(xué)問(wèn)了,既然它基于線程池,那我直接使用線程池或者使用 Android 中其他的異步任務(wù)解決方案,比如 Handler、AsyncTask、RxJava等,不更好嗎?

協(xié)程可以 使用阻塞的方式寫(xiě)出非阻塞式的代碼 ,解決并發(fā)中常見(jiàn)的回調(diào)地獄。消除了并發(fā)任務(wù)之間的協(xié)作的難度,協(xié)程可以讓我們輕松地寫(xiě)出復(fù)雜的并發(fā)代碼。一些本來(lái)不可能實(shí)現(xiàn)的并發(fā)任務(wù)變的可能,甚至簡(jiǎn)單,這些才是協(xié)程的優(yōu)勢(shì)所在。

作用

  • 1.協(xié)程可以讓異步代碼同步化 ;
  • 2.協(xié)程可以降低異步程序的設(shè)計(jì)復(fù)雜度 。

特點(diǎn)

  • 輕量 :您可以在單個(gè)線程上運(yùn)行多個(gè)協(xié)程,因?yàn)閰f(xié)程支持掛起,不會(huì)使正在運(yùn)行協(xié)程的線程阻塞。掛起比阻塞節(jié)省內(nèi)存,且支持多個(gè)并行操作。
  • 內(nèi)存泄漏更少 :使用結(jié)構(gòu)化并發(fā)機(jī)制在一個(gè)作用域內(nèi)執(zhí)行多項(xiàng)操作。
  • 內(nèi)置取消支持 :取消操作會(huì)自動(dòng)在運(yùn)行中的整個(gè)協(xié)程層次結(jié)構(gòu)內(nèi)傳播。
  • Jetpack 集成 :許多 Jetpack 庫(kù)都包含提供全面協(xié)程支持的擴(kuò)展。某些庫(kù)還提供自己的協(xié)程作用域,可供您用于結(jié)構(gòu)化并發(fā)。

Kotlin Coroutine 生態(tài)

圖片

kotlin的協(xié)程實(shí)現(xiàn)分為了兩個(gè)層次:

  • 基礎(chǔ)設(shè)施層 :標(biāo)準(zhǔn)庫(kù)的協(xié)程API,主要對(duì)協(xié)程提供了概念和語(yǔ)義上最基本的支持;
  • 業(yè)務(wù)框架層 kotlin.coroutines :協(xié)程的上層框架支持,基于標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的封裝,也是我們?nèi)粘i_(kāi)發(fā)使用的協(xié)程擴(kuò)展庫(kù)。

依賴庫(kù)

projectgradle 添加 Kotlin 編譯插件:

dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
}

要使用協(xié)程,還需要在app的 build.gradle 文件中添加依賴:

dependencies {
     //協(xié)程標(biāo)準(zhǔn)庫(kù)
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
    //協(xié)程核心庫(kù)
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
    //協(xié)程Android支持庫(kù),提供安卓UI調(diào)度器
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
}

這里我們主要使用協(xié)程擴(kuò)展庫(kù), kotlin協(xié)程標(biāo)準(zhǔn)庫(kù)太過(guò)于簡(jiǎn)陋不適用于開(kāi)發(fā)者使用。

二、原理

協(xié)程的概念最核心的點(diǎn)就是函數(shù)或者一段程序能夠被掛起,稍后再在掛起的位置恢復(fù) 。協(xié)程通過(guò)主動(dòng)讓出運(yùn)行權(quán)來(lái)實(shí)現(xiàn)協(xié)作,程序自己處理掛起和恢復(fù)來(lái)實(shí)現(xiàn)程序執(zhí)行流程的協(xié)作調(diào)度。因此它本質(zhì)上就是在討論程序控制流程的機(jī)制。

使用場(chǎng)景

kotlin協(xié)程基于Thread相關(guān)API的封裝,讓我們不用過(guò)多關(guān)心線程也可以方便地寫(xiě)出并發(fā)操作,這就是Kotlin的協(xié)程。協(xié)程的好處本質(zhì)上和其他線程api一樣, 方便 。

在 Android 平臺(tái)上,協(xié)程有兩個(gè)主要使用場(chǎng)景:

  • 1、線程切換,保證線程安全。
  • 2、處理耗時(shí)任務(wù)(比如網(wǎng)絡(luò)請(qǐng)求、解析JSON數(shù)據(jù)、從數(shù)據(jù)庫(kù)中進(jìn)行讀寫(xiě)操作等)。

Kotlin協(xié)程的原理

我們使用 Retrofit 發(fā)起了一個(gè)異步請(qǐng)求,從服務(wù)端查詢用戶的信息,通過(guò) CallBack 返回 response

val call: Call

很明顯我們需要處理很多的回調(diào)分支,如果業(yè)務(wù)多則更容易陷入「回調(diào)地獄」繁瑣凌亂的代碼中。

使用協(xié)程,同樣可以像 Rx 那樣有效地消除回調(diào)地獄,不過(guò)無(wú)論是設(shè)計(jì)理念,還是代碼風(fēng)格,兩者是有很大區(qū)別的,協(xié)程在寫(xiě)法上和普通的順序代碼類(lèi)似,同步的方式去編寫(xiě)異步執(zhí)行的代碼。使用協(xié)程改造后代碼如下:

GlobalScope.launch(Dispatchers.Main) {//開(kāi)始協(xié)程:主線程
    val result = userApi.getUserSuspend("suming")//網(wǎng)絡(luò)請(qǐng)求(IO 線程)
    tv_name.text = result?.name //更新 UI(主線程)
}

這就是kotlin最有名的【非阻塞式掛起】,使用同步的方式完成異步任務(wù),而且很簡(jiǎn)潔,這是Kotlin協(xié)程的魅力所在。之所有可以用看起來(lái)同步的方式寫(xiě)異步代碼,關(guān)鍵在于請(qǐng)求函數(shù)getUserSuspend()是一個(gè) 掛起函數(shù) ,被suspend關(guān)鍵字修飾,下面會(huì)介紹。

圖片

在上面的協(xié)程的原理圖解中,耗時(shí)阻塞的操作并沒(méi)有減少,只是交給了其他線程。userApi.getUserSuspend("suming")真正執(zhí)行的時(shí)候會(huì)切換到IO線程中執(zhí)行,獲取結(jié)果后最后恢復(fù)到主線程上,然后繼續(xù)執(zhí)行剩下的流程。

將業(yè)務(wù)流程原理拆分得更細(xì)致一點(diǎn),在主線程中創(chuàng)建協(xié)程A中執(zhí)行整個(gè)業(yè)務(wù)流程,如果遇到異步調(diào)用任務(wù)則協(xié)程A被掛起,切換到IO線程中創(chuàng)建子協(xié)程B,獲取結(jié)果后再恢復(fù)到主線程的協(xié)程A上,然后繼續(xù)執(zhí)行剩下的流程。

圖片

協(xié)程Coroutine雖然不能脫離線程而運(yùn)行,但可以在不同的線程之間切換,而且一個(gè)線程上可以一個(gè)或多個(gè)協(xié)程。下圖動(dòng)態(tài)顯示了進(jìn)程 - 線程 - 協(xié)程微妙關(guān)系。

圖片

此動(dòng)圖來(lái)源

三、基礎(chǔ)

GlobalScope.launch(Dispatchers.Main) {//開(kāi)始協(xié)程:主線程
   val result = userApi.getUserSuspend("suming")//網(wǎng)絡(luò)請(qǐng)求(IO 線程)
   tv_name.text = result?.name //更新 UI(主線程)
}

上面就是啟動(dòng)協(xié)程的代碼,啟動(dòng)協(xié)程的代碼可以分為三部分:GlobalScope、launchDispatchers,它們分別對(duì)應(yīng):協(xié)程的作用域、構(gòu)建器和調(diào)度器。

1.協(xié)程的構(gòu)建

上面的GlobalScope.launch()屬于協(xié)程構(gòu)建器Coroutine builders,Kotlin 中還有其他幾種 Builders, 負(fù)責(zé)創(chuàng)建協(xié)程

  • runBlocking:T:頂層函數(shù),創(chuàng)建一個(gè)新的協(xié)程同時(shí)阻塞當(dāng)前線程,直到其內(nèi)部所有邏輯以及子協(xié)程所有邏輯全部執(zhí)行完成,返回值是泛型T,一般在項(xiàng)目中不會(huì)使用,主要是為main函數(shù)和測(cè)試設(shè)計(jì)的。
  • launch:?創(chuàng)建一個(gè)新的協(xié)程,不會(huì)阻塞當(dāng)前線程,必須在協(xié)程作用域中才可以調(diào)用。它返回的是一個(gè)該協(xié)程任務(wù)的引用,即Job對(duì)象。這是最常用的用于啟動(dòng)協(xié)程的方式。
  • async:?創(chuàng)建一個(gè)新的協(xié)程,不會(huì)阻塞當(dāng)前線程,必須在協(xié)程作用域中才可以調(diào)用。并返回Deffer對(duì)象,可通過(guò)調(diào)用Deffer.await()方法等待該子協(xié)程執(zhí)行完成并獲取結(jié)果。常用于并發(fā)執(zhí)行-同步等待和獲取返回值的情況。

runBlocking

fun  runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T
  • context:??協(xié)程的上下文,表示協(xié)程的運(yùn)行環(huán)境,包括協(xié)程調(diào)度器、代表協(xié)程本身的Job、協(xié)程名稱(chēng)、協(xié)程ID等,默認(rèn)值是當(dāng)前線程上的事件循環(huán)。(這里的context和Android的context不同,后面會(huì)講解到)
  • block:???協(xié)程執(zhí)行體,是一個(gè)用suspend關(guān)鍵字修飾的一個(gè)無(wú)參,無(wú)返回值的函數(shù)類(lèi)型。是一個(gè)帶接收者的函數(shù)字面量,接收者是 CoroutineScope ,因此執(zhí)行體包含了一個(gè)隱式的 CoroutineScope,所以在 runBlocking 內(nèi)部可以來(lái)直接啟動(dòng)協(xié)程。
  • T:?????返回值是泛型T,協(xié)程體block中最后一行返回的是什么類(lèi)型T就是什么類(lèi)型。

它是一個(gè)頂層函數(shù),不是GlobalScope的 API,可以在任意地方獨(dú)立使用。它能創(chuàng)建一個(gè)新的協(xié)程同時(shí)阻塞當(dāng)前線程,直到其內(nèi)部所有邏輯以及子協(xié)程所有邏輯全部執(zhí)行完成,它的目的是將常規(guī)的阻塞代碼與以掛起suspend風(fēng)格編寫(xiě)的庫(kù)連接起來(lái),常用于main函數(shù)和測(cè)試中。一般我們?cè)陧?xiàng)目中是不會(huì)使用的。

fun runBloTest() {
    print("start")
    //context上下文使用默認(rèn)值,阻塞當(dāng)前線程,直到代碼塊中的邏輯完成
    runBlocking {
        //這里是協(xié)程體
        delay(1000)//掛起函數(shù),延遲1000毫秒
        print("runBlocking")
    }
    print("end")
}

打印數(shù)據(jù)如下:

圖片

runBlocking.gif

只有在runBlocking協(xié)程體邏輯全部運(yùn)行結(jié)束后,聲明在runBlocking之后的代碼才能執(zhí)行,即runBlocking會(huì)阻塞其所在線程。

注意:runBlocking 雖然會(huì)阻塞當(dāng)前線程的,但其內(nèi)部運(yùn)行的協(xié)程又是非阻塞的。

launch

launch是最常用的用于啟動(dòng)協(xié)程的方式,用于在不阻塞當(dāng)前線程的情況下啟動(dòng)一個(gè)協(xié)程,并返回對(duì)該協(xié)程任務(wù)的引用,即Job對(duì)象。

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job
  • context:?協(xié)程的上下文,表示協(xié)程的運(yùn)行環(huán)境,包括協(xié)程調(diào)度器、代表協(xié)程本身的Job、協(xié)程名稱(chēng)、協(xié)程ID等,默認(rèn)值是當(dāng)前線程上的事件循環(huán)。
  • start: ?協(xié)程啟動(dòng)模式,這些啟動(dòng)模式的設(shè)計(jì)主要是為了應(yīng)對(duì)某些特殊的場(chǎng)景。業(yè)務(wù)開(kāi)發(fā)實(shí)踐中通常使用DEFAULTLAZY這兩個(gè)啟動(dòng)模式就夠了。
  • block:??協(xié)程代碼,它將在提供的范圍的上下文中被調(diào)用。它是一個(gè)用suspend(掛起函數(shù))關(guān)鍵字修飾的一個(gè)無(wú)參,無(wú)返回值的函數(shù)類(lèi)型。接收者是CoroutineScope的函數(shù)字面量。
  • Job:???協(xié)程構(gòu)建函數(shù)的返回值,可以把Job看成協(xié)程對(duì)象本身,封裝了協(xié)程中需要執(zhí)行的代碼邏輯,是協(xié)程的唯一標(biāo)識(shí),Job可以取消,并且負(fù)責(zé)管理協(xié)程的生命周期。

協(xié)程需要運(yùn)行在協(xié)程上下文環(huán)境中 (即協(xié)程作用域,下面會(huì)講解到),在非協(xié)程環(huán)境中launch有兩種方式創(chuàng)建協(xié)程:

GlobalScope.launch()

在應(yīng)用范圍內(nèi)啟動(dòng)一個(gè)新協(xié)程,不會(huì)阻塞調(diào)用線程,協(xié)程的生命周期與應(yīng)用程序一致。表示一個(gè)不綁定任何Job的全局作用域,用于啟動(dòng)頂層協(xié)程,這些協(xié)程在整個(gè)應(yīng)用程序生命周期中運(yùn)行,不會(huì)提前取消(不存在Job)。

fun launchTest() {
    print("start")
    //創(chuàng)建一個(gè)全局作用域協(xié)程,不會(huì)阻塞當(dāng)前線程,生命周期與應(yīng)用程序一致
    GlobalScope.launch {
        //在這1000毫秒內(nèi)該協(xié)程所處的線程不會(huì)阻塞
        //協(xié)程將線程的執(zhí)行權(quán)交出去,該線程繼續(xù)干它要干的事情,到時(shí)間后會(huì)恢復(fù)至此繼續(xù)向下執(zhí)行
        delay(1000)//1秒無(wú)阻塞延遲(默認(rèn)單位為毫秒)
        print("GlobalScope.launch")
    }
    print("end")//主線程繼續(xù),而協(xié)程被延遲
}

GlobalScope.launch()協(xié)程將線程的執(zhí)行權(quán)交出去,該線程繼續(xù)干它要干的事情,主線程繼續(xù),而協(xié)程被延遲,到時(shí)間后會(huì)恢復(fù)至此繼續(xù)向下執(zhí)行。

打印數(shù)據(jù)如下:

圖片

launch1.gif

由于這樣啟動(dòng)的協(xié)程存在組件已被銷(xiāo)毀但協(xié)程還存在的情況,極限情況下可能導(dǎo)致資源耗盡,尤其是在 Android 客戶端這種需要頻繁創(chuàng)建銷(xiāo)毀組件的場(chǎng)景,因此不推薦這種用法。

注意:這里說(shuō)的是GlobalScope沒(méi)有Job, 但是啟動(dòng)的launch是有Job的。 GlobalScope本身就是一個(gè)作用域, launch屬于其子作用域。

CoroutineScope.launch()

啟動(dòng)一個(gè)新的協(xié)程而不阻塞當(dāng)前線程,并返回對(duì)協(xié)程的引用作為一個(gè)Job。通過(guò)CoroutineContext至少一個(gè)協(xié)程上下文參數(shù)創(chuàng)建一個(gè) CoroutineScope對(duì)象。協(xié)程上下文控制協(xié)程生命周期和線程調(diào)度,使得協(xié)程和該組件生命周期綁定,組件銷(xiāo)毀時(shí),協(xié)程一并銷(xiāo)毀,從而實(shí)現(xiàn)安全可靠地協(xié)程調(diào)用。這是在應(yīng)用中最推薦使用的協(xié)程使用方式。

fun launchTest2() {
    print("start")
    //開(kāi)啟一個(gè)IO模式的協(xié)程,通過(guò)協(xié)程上下文創(chuàng)建一個(gè)CoroutineScope對(duì)象,需要一個(gè)類(lèi)型為CoroutineContext的參數(shù)
    val job = CoroutineScope(Dispatchers.IO).launch {
        delay(1000)//1秒無(wú)阻塞延遲(默認(rèn)單位為毫秒)
        print("CoroutineScope.launch")
    }
    print("end")//主線程繼續(xù),而協(xié)程被延遲
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3980

    瀏覽量

    132283
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2992

    瀏覽量

    114737
  • ui
    ui
    +關(guān)注

    關(guān)注

    0

    文章

    208

    瀏覽量

    22109
  • kotlin
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    4427
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    談?wù)?b class='flag-5'>協(xié)的那些事兒

    隨著異步編程的發(fā)展以及各種并發(fā)框架的普及,協(xié)作為一種異步編程規(guī)范在各類(lèi)語(yǔ)言中地位逐步提高。我們不單單會(huì)在自己的程序中使用協(xié),各類(lèi)框架如fastapi,aiohttp等也都是基于異步
    的頭像 發(fā)表于 01-26 11:36 ?1631次閱讀
    談?wù)?b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>的那些事兒

    Python中的多核CPU共享數(shù)據(jù)協(xié)詳解

    協(xié)又稱(chēng)微線程,coroutne,協(xié)是一種用戶態(tài)的輕量級(jí)線程。通俗點(diǎn)講就是周末我在家里休息,假如我先洗漱,再煮飯,再下載電影看會(huì)很慢,用了協(xié)
    的頭像 發(fā)表于 12-07 10:23 ?7113次閱讀
    Python中的多核CPU共享數(shù)據(jù)<b class='flag-5'>之</b><b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>詳解

    Python自動(dòng)化運(yùn)維協(xié)函數(shù)賦值過(guò)程

    協(xié)的優(yōu)點(diǎn):(1)無(wú)需線程上下文切換的開(kāi)銷(xiāo),協(xié)避免了無(wú)意義的調(diào)度,由此可以提高性能(但也因此,程序員必須自己承擔(dān)調(diào)度的責(zé)任,同時(shí),
    的頭像 發(fā)表于 03-18 11:22 ?3989次閱讀

    關(guān)于C++ 20協(xié)最全面詳解

    花了一兩周的時(shí)間后,我想寫(xiě)寫(xiě) C++20 協(xié)的基本用法,因?yàn)?C++ 的協(xié)讓我感到很奇怪,寫(xiě)一個(gè)協(xié)
    的頭像 發(fā)表于 04-12 11:10 ?1.4w次閱讀
    關(guān)于C++ 20<b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>最全面詳解

    Python后端項(xiàng)目的協(xié)是什么

    最近公司 Python 后端項(xiàng)目進(jìn)行重構(gòu),整個(gè)后端邏輯基本都變更為采用“異步”協(xié)的方式實(shí)現(xiàn)。看著滿屏幕經(jīng)過(guò) async await(協(xié)在 Python 中的實(shí)現(xiàn))修飾的代碼,我頓時(shí)
    的頭像 發(fā)表于 09-23 14:38 ?1717次閱讀

    Python協(xié)與JavaScript協(xié)的對(duì)比及經(jīng)驗(yàn)技巧

    前言以前沒(méi)怎么接觸前端,對(duì) JavaScript 的異步操作不了解,現(xiàn)在有了點(diǎn)了解。一查發(fā)現(xiàn) Python 和 JavaScript 的協(xié)發(fā)展史簡(jiǎn)直就是一毛一樣!這里大致做下橫向?qū)Ρ群涂偨Y(jié),便于
    的頭像 發(fā)表于 10-20 14:30 ?2287次閱讀

    使用channel控制協(xié)數(shù)量

    goroutine 是輕量級(jí)線程,調(diào)度由 Go 運(yùn)行時(shí)進(jìn)行管理的。Go 語(yǔ)言的并發(fā)控制主要使用關(guān)鍵字 go 開(kāi)啟協(xié) goroutine。Go 協(xié)(Goroutine)之間通過(guò)信道(
    的頭像 發(fā)表于 09-19 15:06 ?1542次閱讀

    詳解Linux線程、線程與異步編程、協(xié)與異步

    協(xié)不是系統(tǒng)級(jí)線程,很多時(shí)候協(xié)被稱(chēng)為“輕量級(jí)線程”、“微線程”、“纖(fiber)”等。簡(jiǎn)單來(lái)說(shuō)可以認(rèn)為
    的頭像 發(fā)表于 03-16 15:49 ?1609次閱讀

    協(xié)的概念及協(xié)的掛起函數(shù)介紹

    協(xié)是一種輕量級(jí)的線程,它可以在單個(gè)線程中實(shí)現(xiàn)并發(fā)執(zhí)行。與線程不同,協(xié)不需要操作系統(tǒng)的上下文切換,因此可以更高效地使用系統(tǒng)資源。Kotlin
    的頭像 發(fā)表于 04-19 10:20 ?1357次閱讀

    Kotlin協(xié)實(shí)戰(zhàn)進(jìn)階2

    協(xié)的概念在1958年就開(kāi)始出現(xiàn)(比線程還早), 目前很多語(yǔ)言開(kāi)始原生支, Java 沒(méi)有原生協(xié)但是大型公司都自己或者使用第三方庫(kù)來(lái)支持協(xié)
    的頭像 發(fā)表于 05-30 16:25 ?1304次閱讀
    <b class='flag-5'>Kotlin</b><b class='flag-5'>協(xié)</b><b class='flag-5'>程</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>進(jìn)階</b><b class='flag-5'>之</b><b class='flag-5'>筑</b><b class='flag-5'>基</b><b class='flag-5'>篇</b>2

    Kotlin協(xié)實(shí)戰(zhàn)進(jìn)階3

    協(xié)的概念在1958年就開(kāi)始出現(xiàn)(比線程還早), 目前很多語(yǔ)言開(kāi)始原生支, Java 沒(méi)有原生協(xié)但是大型公司都自己或者使用第三方庫(kù)來(lái)支持協(xié)
    的頭像 發(fā)表于 05-30 16:26 ?1114次閱讀

    FreeRTOS任務(wù)與協(xié)介紹

    。 協(xié)是為那些資源很少的 MCU 準(zhǔn)備的,其開(kāi)銷(xiāo)很小,但是 FreeRTOS 官方已經(jīng)不打算再更新協(xié)了。 任務(wù)特性: 1、簡(jiǎn)單。 2、沒(méi)
    的頭像 發(fā)表于 09-28 11:02 ?1460次閱讀

    C++20無(wú)棧協(xié)超輕量高性能異步庫(kù)開(kāi)發(fā)實(shí)戰(zhàn)

    來(lái)了,c++標(biāo)準(zhǔn)委員會(huì)的謹(jǐn)慎態(tài)度也造就了c++20的給出來(lái)協(xié):“性能優(yōu)秀”,“開(kāi)發(fā)靈活”和讓人勸退的“門(mén)檻之高”。 不過(guò)話說(shuō)回來(lái),c++從出身就注定了背負(fù)性能使命,他不是為簡(jiǎn)單為
    的頭像 發(fā)表于 11-09 10:20 ?2369次閱讀

    協(xié)的實(shí)現(xiàn)與原理

    前言 協(xié)這個(gè)概念很久了,好多程序員是實(shí)現(xiàn)過(guò)這個(gè)組件的,網(wǎng)上關(guān)于協(xié)的文章,博客,論壇都是汗牛充棟,在知乎,github上面也有很多大牛寫(xiě)了關(guān)于協(xié)
    的頭像 發(fā)表于 11-10 10:57 ?896次閱讀

    Linux線程、線程與異步編程、協(xié)與異步介紹

    協(xié)不是系統(tǒng)級(jí)線程,很多時(shí)候協(xié)被稱(chēng)為“輕量級(jí)線程”、“微線程”、“纖(fiber)”等。簡(jiǎn)單來(lái)說(shuō)可以認(rèn)為
    的頭像 發(fā)表于 11-11 11:35 ?1852次閱讀
    Linux線程、線程與異步編程、<b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>與異步介紹