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

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

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

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

jf_78858299 ? 來(lái)源:labuladong ? 作者:labuladong ? 2023-04-19 10:20 ? 次閱讀

什么是協(xié)程

協(xié)程是一種輕量級(jí)的線程,它可以在單個(gè)線程中實(shí)現(xiàn)并發(fā)執(zhí)行。與線程不同,協(xié)程不需要操作系統(tǒng)的上下文切換,因此可以更高效地使用系統(tǒng)資源。Kotlin 協(xié)程是 Kotlin 語(yǔ)言的一項(xiàng)特性,它提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)處理異步任務(wù)。

相關(guān)的基本概念

掛起函數(shù)

掛起函數(shù)是一種特殊的函數(shù),它可以在執(zhí)行過(guò)程中暫停并等待某些操作完成。在 Kotlin 中,掛起函數(shù)使用 suspend 關(guān)鍵字進(jìn)行標(biāo)記。掛起函數(shù)的特點(diǎn)是可以在函數(shù)內(nèi)部使用 suspend 關(guān)鍵字標(biāo)記的其他掛起函數(shù),這些掛起函數(shù)會(huì)在執(zhí)行過(guò)程中暫停當(dāng)前協(xié)程的執(zhí)行,并等待異步任務(wù)的結(jié)果。當(dāng)異步任務(wù)完成后,協(xié)程會(huì)自動(dòng)恢復(fù)執(zhí)行,并將結(jié)果返回給調(diào)用方。

以下是一個(gè)使用掛起函數(shù)的例子,該例子使用 Retrofit 庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求:

suspend fun fetchUser(userId: String): User {
    return withContext(Dispatchers.IO) {
        // 創(chuàng)建 Retrofit 實(shí)例
        val retrofit = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        // 創(chuàng)建 API 接口
        val apiService = retrofit.create(ApiService::class.java)
        // 發(fā)起網(wǎng)絡(luò)請(qǐng)求
        val response = apiService.getUser(userId)
        // 解析響應(yīng)
        val user = response.body()
        // 返回結(jié)果
        user ?: throw IllegalStateException("User not found")
    }
}

在上面的例子中,fetchUser 函數(shù)使用了 withContext 函數(shù)來(lái)切換到 IO 線程執(zhí)行網(wǎng)絡(luò)請(qǐng)求。在網(wǎng)絡(luò)請(qǐng)求的過(guò)程中,使用了 Retrofit 庫(kù)提供的掛起函數(shù) getUser 來(lái)發(fā)起網(wǎng)絡(luò)請(qǐng)求,并等待響應(yīng)結(jié)果。當(dāng)響應(yīng)結(jié)果返回后,協(xié)程會(huì)自動(dòng)恢復(fù)執(zhí)行,并將結(jié)果返回給調(diào)用方。

需要注意的是,掛起函數(shù)只能在協(xié)程中使用,不能在普通的函數(shù)中使用。在使用掛起函數(shù)時(shí),我們需要將其包裝在協(xié)程作用域中,以便管理協(xié)程的生命周期。例如:

val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
    val user = fetchUser("123")
    // 處理用戶數(shù)據(jù)
}
scope.cancel()

在上面的例子中,我們使用了協(xié)程作用域來(lái)管理協(xié)程的生命周期。在協(xié)程作用域中,我們使用 launch 函數(shù)來(lái)啟動(dòng)一個(gè)新的協(xié)程,并在其中調(diào)用 fetchUser 函數(shù)來(lái)獲取用戶數(shù)據(jù)。當(dāng)協(xié)程作用域結(jié)束時(shí),協(xié)程會(huì)自動(dòng)取消,避免了線程泄漏的問(wèn)題。

協(xié)程作用域

協(xié)程作用域是一種管理協(xié)程的機(jī)制,它可以確保協(xié)程在指定的作用域內(nèi)運(yùn)行,并在作用域結(jié)束時(shí)自動(dòng)取消協(xié)程。在 Kotlin 中,協(xié)程作用域由 CoroutineScope 接口表示。

協(xié)程作用域的主要作用是管理協(xié)程的生命周期。在協(xié)程作用域內(nèi)啟動(dòng)的協(xié)程會(huì)自動(dòng)繼承作用域的上下文和調(diào)度器,并在作用域結(jié)束時(shí)自動(dòng)取消。這樣,我們就可以避免協(xié)程泄漏和線程泄漏的問(wèn)題,提高程序的性能和穩(wěn)定性。

協(xié)程作用域還可以將多個(gè)協(xié)程組合在一起,實(shí)現(xiàn)并發(fā)執(zhí)行。在協(xié)程作用域中,我們可以使用 async 函數(shù)來(lái)啟動(dòng)一個(gè)新的協(xié)程,并返回一個(gè) Deferred 對(duì)象,該對(duì)象可以用于獲取協(xié)程的執(zhí)行結(jié)果。例如:

val scope = CoroutineScope(Dispatchers.IO)
val deferred1 = scope.async { fetchUser("123") }
val deferred2 = scope.async { fetchUser("456") }
val users = listOf(deferred1.await(), deferred2.await())
scope.cancel()

在上面的例子中,我們使用協(xié)程作用域來(lái)管理兩個(gè)協(xié)程的生命周期,并使用 async 函數(shù)來(lái)啟動(dòng)兩個(gè)協(xié)程,分別獲取用戶數(shù)據(jù)。在獲取用戶數(shù)據(jù)的過(guò)程中,我們使用了 await 函數(shù)來(lái)等待協(xié)程的執(zhí)行結(jié)果。當(dāng)兩個(gè)協(xié)程都執(zhí)行完成后,我們將結(jié)果保存到 users 列表中。

?需要注意的是,協(xié)程作用域是一種輕量級(jí)的機(jī)制,它不會(huì)創(chuàng)建新的線程或進(jìn)程。協(xié)程作用域中的協(xié)程會(huì)在當(dāng)前線程中執(zhí)行,并使用協(xié)程調(diào)度器來(lái)管理協(xié)程的執(zhí)行。因此,我們需要根據(jù)具體的需求選擇合適的協(xié)程調(diào)度器,以便實(shí)現(xiàn)最佳的性能和響應(yīng)速度。

?

Dispatchers.IO 是 Kotlin 協(xié)程庫(kù)中的一個(gè)協(xié)程調(diào)度器,它用于將協(xié)程分配到 IO 線程池中執(zhí)行。在協(xié)程中執(zhí)行 IO 操作時(shí),我們通常會(huì)使用 Dispatchers.IO 調(diào)度器來(lái)避免阻塞主線程或其他重要線程。

Android 應(yīng)用程序中,主線程通常用于處理 UI 事件和更新 UI 界面,因此我們應(yīng)該盡量避免在主線程中執(zhí)行耗時(shí)的 IO 操作。如果我們?cè)谥骶€程中執(zhí)行耗時(shí)的 IO 操作,會(huì)導(dǎo)致 UI 界面卡頓或無(wú)響應(yīng),影響用戶體驗(yàn)。為了避免在主線程中執(zhí)行耗時(shí)的 IO 操作,我們可以使用 Dispatchers.IO 調(diào)度器將協(xié)程分配到 IO 線程池中執(zhí)行。IO 線程池通常包含多個(gè)線程,用于執(zhí)行網(wǎng)絡(luò)請(qǐng)求、文件讀寫(xiě)、數(shù)據(jù)庫(kù)操作等耗時(shí)的 IO 操作。在 IO 線程池中執(zhí)行 IO 操作時(shí),我們可以使用掛起函數(shù)來(lái)等待異步操作的完成,而不需要阻塞主線程或其他重要線程。

例如,在下面的例子中,我們使用 Dispatchers.IO 調(diào)度器來(lái)將協(xié)程分配到 IO 線程池中執(zhí)行網(wǎng)絡(luò)請(qǐng)求:

val scope = CoroutineScope(Dispatchers.IO)
scope.launch {
    val response = fetchUser("123")
    // 處理響應(yīng)結(jié)果
}
scope.cancel()

在上面的例子中,我們使用 launch 函數(shù)啟動(dòng)了一個(gè)新的協(xié)程,并使用 Dispatchers.IO 調(diào)度器將其分配到 IO 線程池中執(zhí)行。在協(xié)程中,我們使用 fetchUser 函數(shù)來(lái)發(fā)起網(wǎng)絡(luò)請(qǐng)求,并使用掛起函數(shù)來(lái)等待響應(yīng)結(jié)果的返回。當(dāng)響應(yīng)結(jié)果返回后,協(xié)程會(huì)自動(dòng)恢復(fù)執(zhí)行,并將結(jié)果返回給調(diào)用方。

在 Kotlin 中,我們可以使用 CoroutineScope 接口來(lái)創(chuàng)建協(xié)程作用域,并在作用域內(nèi)啟動(dòng)協(xié)程。在創(chuàng)建協(xié)程作用域時(shí),我們需要指定協(xié)程的上下文和調(diào)度器,以便管理協(xié)程的生命周期和執(zhí)行。

  • 使用 GlobalScope GlobalScope 適用于一些簡(jiǎn)單的、短時(shí)間的任務(wù),例如發(fā)送一條日志、執(zhí)行一個(gè)簡(jiǎn)單的計(jì)算等。由于 GlobalScope 是一個(gè)全局的協(xié)程作用域,因此這種方式不適合長(zhǎng)時(shí)間運(yùn)行的任務(wù),因?yàn)樗赡軙?huì)導(dǎo)致協(xié)程泄漏和線程泄漏的問(wèn)題。
GlobalScope.launch {
    // 發(fā)送一條日志
    Log.d(TAG, "Hello, World!")
}
  • 使用 CoroutineScope CoroutineScope 適用于一些需要長(zhǎng)時(shí)間運(yùn)行的任務(wù),例如網(wǎng)絡(luò)請(qǐng)求、文件讀寫(xiě)、數(shù)據(jù)庫(kù)操作等。在創(chuàng)建協(xié)程作用域時(shí),我們需要指定協(xié)程的上下文和調(diào)度器,以便管理協(xié)程的生命周期和執(zhí)行。
val scope = CoroutineScope(Dispatchers.IO)
scope.launch {
    // 執(zhí)行一個(gè)網(wǎng)絡(luò)請(qǐng)求
    val response = fetchUser("123")
    // 處理響應(yīng)結(jié)果
}

在上面的例子中,我們使用 CoroutineScope 創(chuàng)建了一個(gè)局部的協(xié)程作用域,并使用 Dispatchers.IO 調(diào)度器將協(xié)程分配到 IO 線程池中執(zhí)行。在協(xié)程中,我們使用 fetchUser 函數(shù)來(lái)發(fā)起網(wǎng)絡(luò)請(qǐng)求,并使用掛起函數(shù)來(lái)等待響應(yīng)結(jié)果的返回。當(dāng)響應(yīng)結(jié)果返回后,協(xié)程會(huì)自動(dòng)恢復(fù)執(zhí)行,并將結(jié)果返回給調(diào)用方。

  • runBlocking runBlocking 適用于一些測(cè)試代碼,例如單元測(cè)試、集成測(cè)試等。在測(cè)試代碼中,我們通常需要啟動(dòng)協(xié)程,并等待協(xié)程執(zhí)行完成后進(jìn)行斷言。
@Test
fun testFetchUser() = runBlocking {
    // 啟動(dòng)一個(gè)協(xié)程
    val response = fetchUser("123")
    // 斷言響應(yīng)結(jié)果
    assertEquals("John Doe", response.name)
}

在上面的例子中,我們使用 runBlocking 啟動(dòng)了一個(gè)新的協(xié)程,并在協(xié)程中發(fā)起了一個(gè)網(wǎng)絡(luò)請(qǐng)求。由于這是一個(gè)測(cè)試代碼,因此我們可以使用 runBlocking 阻塞當(dāng)前線程,直到協(xié)程執(zhí)行完成后進(jìn)行斷言。

  • lifecycleScope lifecycleScope 適用于一些需要與 Activity 或 Fragment 的生命周期綁定的任務(wù),例如更新 UI 界面、執(zhí)行后臺(tái)任務(wù)等。在使用 lifecycleScope 時(shí),我們可以避免協(xié)程泄漏和線程泄漏的問(wèn)題,并且可以自動(dòng)取消協(xié)程,以便釋放資源。
class MyFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        lifecycleScope.launch {
            // 更新 UI 界面
            textView.text = "Hello, World!"
            // 執(zhí)行后臺(tái)任務(wù)
            val response = fetchUser("123")
            // 處理響應(yīng)結(jié)果
        }
    }
}

在上面的例子中,我們?cè)?Fragment 的 onViewCreated 方法中使用 lifecycleScope 啟動(dòng)了一個(gè)新的協(xié)程,并將其與 Fragment 的生命周期綁定。當(dāng) Fragment 被銷(xiāo)毀時(shí),lifecycleScope 會(huì)自動(dòng)取消協(xié)程,以便釋放資源。在協(xié)程中,我們可以更新 UI 界面、執(zhí)行后臺(tái)任務(wù)等操作,而不需要擔(dān)心協(xié)程泄漏和線程泄漏的問(wèn)題。

協(xié)程調(diào)度器

協(xié)程調(diào)度器是一種決定協(xié)程在哪個(gè)線程上運(yùn)行的機(jī)制。在 Kotlin 中,協(xié)程調(diào)度器由 CoroutineDispatcher 接口表示。

常用的調(diào)度器如下

  • Dispatchers.Default:將協(xié)程分配到默認(rèn)的線程池中執(zhí)行。默認(rèn)的線程池通常包含多個(gè)線程,用于執(zhí)行 CPU 密集型的計(jì)算任務(wù)。
  • Dispatchers.IO:將協(xié)程分配到 IO 線程池中執(zhí)行。IO 線程池通常包含多個(gè)線程,用于執(zhí)行網(wǎng)絡(luò)請(qǐng)求、文件讀寫(xiě)、數(shù)據(jù)庫(kù)操作等耗時(shí)的 IO 操作。
  • Dispatchers.Main:將協(xié)程分配到主線程中執(zhí)行。主線程通常用于處理 UI 事件和更新 UI 界面。
  • Dispatchers.Unconfined:將協(xié)程分配到當(dāng)前線程中執(zhí)行,直到第一個(gè)掛起點(diǎn)。在第一個(gè)掛起點(diǎn)之后,協(xié)程會(huì)自動(dòng)切換到其他線程或線程池中執(zhí)行。

?除了上述常用的調(diào)度器之外,我們還可以自定義調(diào)度器,以便更好地滿足具體的需求。例如,我們可以使用 newSingleThreadContext 函數(shù)創(chuàng)建一個(gè)新的單線程調(diào)度器,用于將協(xié)程分配到單個(gè)線程中執(zhí)行。

?

協(xié)程上下文

協(xié)程上下文是一組鍵值對(duì),它包含了協(xié)程的一些屬性和配置信息。在 Kotlin 中,協(xié)程上下文由 CoroutineContext 接口表示。

在 Kotlin 協(xié)程中,協(xié)程上下文(Coroutine Context)是一個(gè)包含了協(xié)程執(zhí)行所需的各種元素的對(duì)象。協(xié)程上下文可以包含多個(gè)元素,例如調(diào)度器、異常處理器、協(xié)程名稱等。在協(xié)程中,我們可以使用 coroutineContext 屬性來(lái)訪問(wèn)當(dāng)前協(xié)程的上下文。

以下是協(xié)程上下文中常用的元素:

  • Job:協(xié)程的任務(wù),用于管理協(xié)程的生命周期和取消操作。
  • CoroutineDispatcher:協(xié)程的調(diào)度器,用于將協(xié)程分配到不同的線程或線程池中執(zhí)行。
  • CoroutineExceptionHandler:協(xié)程的異常處理器,用于處理協(xié)程中發(fā)生的異常。
  • CoroutineName:協(xié)程的名稱,用于標(biāo)識(shí)協(xié)程的作用和用途。

在協(xié)程中,我們可以使用 CoroutineScope 接口來(lái)創(chuàng)建協(xié)程作用域,并在作用域內(nèi)啟動(dòng)協(xié)程。在創(chuàng)建協(xié)程作用域時(shí),我們可以指定協(xié)程的上下文和調(diào)度器,以便管理協(xié)程的生命周期和執(zhí)行。

在協(xié)程中,我們可以使用 withContext 函數(shù)來(lái)切換協(xié)程的上下文和調(diào)度器。withContext 函數(shù)會(huì)掛起當(dāng)前協(xié)程,并在指定的上下文和調(diào)度器中啟動(dòng)一個(gè)新的協(xié)程。當(dāng)新的協(xié)程執(zhí)行完成后,withContext 函數(shù)會(huì)自動(dòng)恢復(fù)當(dāng)前協(xié)程的執(zhí)行。

以下是使用 withContext 函數(shù)切換協(xié)程上下文的示例:

suspend fun fetchUser(id: String): User = withContext(Dispatchers.IO) {
    // 在 IO 線程池中執(zhí)行網(wǎng)絡(luò)請(qǐng)求
    val response = apiService.fetchUser(id)
    // 解析響應(yīng)結(jié)果
    val user = response.toUser()
    // 返回用戶信息
    user
}

在上面的例子中,我們使用 withContext函數(shù)將協(xié)程的上下文切換到 Dispatchers.IO 調(diào)度器中,并在 IO 線程池中執(zhí)行網(wǎng)絡(luò)請(qǐng)求。當(dāng)網(wǎng)絡(luò)請(qǐng)求完成后,withContext 函數(shù)會(huì)自動(dòng)恢復(fù)當(dāng)前協(xié)程的執(zhí)行,并將解析后的用戶信息返回給調(diào)用方。

除了使用 withContext 函數(shù)切換協(xié)程上下文外,我們還可以使用 CoroutineScope 接口的擴(kuò)展函數(shù)來(lái)切換協(xié)程上下文。以下是使用 CoroutineScope 接口的擴(kuò)展函數(shù)切換協(xié)程上下文的示例:

val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
    // 在主線程中執(zhí)行 UI 操作
    textView.text = "Loading..."
    // 切換協(xié)程上下文到 IO 線程池中執(zhí)行網(wǎng)絡(luò)請(qǐng)求
    val user = withContext(Dispatchers.IO) {
        apiService.fetchUser("123")
    }
    // 切換協(xié)程上下文到主線程中更新 UI 界面
    textView.text = "Hello, ${user.name}!"
}

在上面的例子中,我們使用 CoroutineScope 創(chuàng)建了一個(gè)局部的協(xié)程作用域,并將其與主線程的調(diào)度器綁定。在協(xié)程中,我們使用 withContext 函數(shù)將協(xié)程的上下文切換到 IO 線程池中執(zhí)行網(wǎng)絡(luò)請(qǐng)求。當(dāng)網(wǎng)絡(luò)請(qǐng)求完成后,我們?cè)俅问褂?withContext 函數(shù)將協(xié)程的上下文切換回主線程中更新 UI 界面。

最后

這篇文章主要介紹了協(xié)程的概念,協(xié)程的掛起函數(shù),作用域,調(diào)度器和上下文,更多文章可以關(guān)注公眾號(hào)QStack。

聲明:本文內(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)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6603

    瀏覽量

    123021
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    502

    瀏覽量

    19613
  • kotlin
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    4177
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    協(xié)和線程有什么區(qū)別

    協(xié)和線程的區(qū)別協(xié)和線程的共同目的之一是實(shí)現(xiàn)系統(tǒng)資源的上下文調(diào)用,不過(guò)它們的實(shí)現(xiàn)層級(jí)不同;線程(Thraed)是比進(jìn)程小一級(jí)的的運(yùn)行單位,多線程實(shí)現(xiàn)系統(tǒng)資源上下文調(diào)用,是編程語(yǔ)言交付
    發(fā)表于 12-10 06:23

    什么是多任務(wù)系統(tǒng)?FreeRTOS任務(wù)與協(xié)簡(jiǎn)析

    功能,初學(xué)者必須先掌握——任務(wù)的創(chuàng)建、刪除、掛起和恢復(fù)等操作。本章節(jié)分為如下幾部分:*什么是多任務(wù)系統(tǒng)*FreeRTOS任務(wù)與協(xié)*初次使用*任務(wù)狀態(tài)*任務(wù)優(yōu)先級(jí)*任務(wù)實(shí)現(xiàn)*任務(wù)控制塊*任務(wù)堆棧一、什么是多任務(wù)系統(tǒng)單片機(jī)一般都是
    發(fā)表于 02-18 06:38

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

    花了一兩周的時(shí)間后,我想寫(xiě)寫(xiě) C++20 協(xié)的基本用法,因?yàn)?C++ 的協(xié)讓我感到很奇怪,寫(xiě)一個(gè)協(xié)
    的頭像 發(fā)表于 04-12 11:10 ?1.3w次閱讀
    關(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 ?1284次閱讀

    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 ?1821次閱讀

    通過(guò)例子由淺入深的理解yield協(xié)

    send:send() 方法致使協(xié)程前進(jìn)到下一個(gè)yield 語(yǔ)句,另外,生成器可以作為協(xié)使用
    的頭像 發(fā)表于 08-23 11:12 ?1952次閱讀

    使用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 ?1077次閱讀

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

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

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

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

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

    FreeRTOS 中應(yīng)用既可以使用任務(wù),也可以使用協(xié)(Co-Routine),或者兩者混合使用。但是任務(wù)和協(xié)使用不同的API函數(shù),因此不能通過(guò)隊(duì)列(或信號(hào)量)將數(shù)據(jù)從任務(wù)發(fā)送給
    的頭像 發(fā)表于 09-28 11:02 ?906次閱讀

    協(xié)的作用、結(jié)構(gòu)及原理

    本文介紹協(xié)的作用、結(jié)構(gòu)、原理,并使用C++和匯編實(shí)現(xiàn)了64位系統(tǒng)下的協(xié)池。文章內(nèi)容避免了協(xié)
    的頭像 發(fā)表于 11-08 16:39 ?1009次閱讀
    <b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>的作用、結(jié)構(gòu)及原理

    C/C++協(xié)編程的相關(guān)概念和技巧

    自己的寄存器上下文和棧,可以在多個(gè)入口點(diǎn)間自由切換,而不是像傳統(tǒng)的函數(shù)調(diào)用那樣在一個(gè)入口點(diǎn)開(kāi)始、另一個(gè)入口點(diǎn)結(jié)束。協(xié)概念最早可以追溯到1963年,由Melvin Conway提出。
    的頭像 發(fā)表于 11-09 11:34 ?595次閱讀

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

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

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

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