协程搬运工-组合挂起函数

简介: 协程搬运工-组合挂起函数

默认顺序调用


顺序调用两个 suspend 函数的时候,两个函数是串行执行的

  1. 代码
fun main() = runBlocking {
    val startStamp = System.currentTimeMillis()
    a()
    b()
    log("代码运行总时长:${System.currentTimeMillis()-startStamp}")
}
suspend fun a(){
    delay(2000)
    log(A)
}
suspend fun b(){
    delay(3000)
    log(B)
}
复制代码
  1. 日志
日志:  A
日志:  B
日志:  代码运行总时长:5015
复制代码
  1. 结论 协程里面两个并行的 suspend 函数会串行执行,呼应开头的结论


使用 async 实现并发


上面例子中我们使用两个 suspend 函数串行执行函数,如果使用两个 async 执行 suspend 方法的话可以实现并发执行的效果。

aysnc 返回一个 Deferred 对象,Deferred 是一个轻量级阻塞式对象,可以调用 Deferred.await()延迟获取返回结果

Deferred 也是一个 Job,所以也可以取消操作

  1. 代码
fun main() = runBlocking {
    val startStamp = System.currentTimeMillis()
    val deferredA=async {
        a()
    }
    val deferredB=async {
        b()
    }
    deferredA.await()
    deferredB.await()
    log("执行总时长:${System.currentTimeMillis()-startStamp}")
}
suspend fun a(){
    delay(2000)
    log(A)
}
suspend fun b(){
    delay(3000)
    log(B)
}
复制代码
  1. 日志
日志:  A
日志:  B
日志:  执行总时长:3022
复制代码
  1. 结论 上一节中代码执行总耗时 5105,本节总耗时 3022。这说明两个 async 是并发执行的


惰性启动的 async


async 可以通过将 start 参数设置为 CoroutineStart.LAZY 而变为惰性的。 在这个模式下,只有结果通过 await 获取的时候协程才会启动,或者在 Job 的 start 函数调用的时候

  1. 代码
fun main() = runBlocking {
    val deferred = async (start = CoroutineStart.LAZY){
        delay(2000)
        log(A)
        "async执行完成"
    }
    log(deferred.await())
}
复制代码
  1. 日志
日志:  A
日志:  async执行完成
复制代码
  1. 结论
    必须调用 await 或 start 才能启动


使用 async 的结构性并发


协程体作用域中并发的多个 async,有一个发生异常其它的 async 也会被取消

  1. 代码
fun main() = runBlocking {
    async {
        log("吃饭aa,别bb")
        delay(100)
        throw IllegalArgumentException("打你一嘴巴子,你再bb")
    }
   async {
       log("就bb,咋地")
       delay(300)
       log("bb完了")
   }
    log("程序结束")
}
复制代码
  1. 日志
日志:  程序结束
日志:  吃饭aa,别bb
日志:  就bb,咋地
Exception in thread "main" java.lang.IllegalArgumentException: 打你一嘴巴子,你再bb
  at SuspendMethodKt$main$1$1.invokeSuspend(SuspendMethod.kt:55)
复制代码
  1. 记录
    当第一个 async 抛出异常后,第二个 async 后面 “bb 完了”的日志没有打印,说了第二个 async 也同步被取消了。



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Java 调度
协程搬运工-上下文和调度器
协程搬运工-上下文和调度器
协程搬运工-取消与超时
协程搬运工-取消与超时
225 0
|
1月前
|
并行计算 调度 开发者
深入浅出Python协程:提升你的异步编程效率
在当今快速发展的软件开发领域,异步编程已成为提高程序性能和用户体验的关键技术。Python,作为一门广泛使用的高级编程语言,其协程(Coroutine)功能为开发者提供了强大的异步编程工具。本文将从协程的基本概念入手,通过实例深入浅出地讲解如何在Python中有效利用协程来提升异步编程的效率和可读性。我们将探讨协程的工作原理、与传统多线程/多进程相比的优势,以及如何在实际项目中应用协程来解决复杂的并发问题。通过本文的学习,读者将能够掌握Python协程的核心知识,为构建高效、可维护的异步应用奠定坚实基础。
|
2天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
17 0
|
23天前
|
API 数据处理 调度
Python中的异步编程与协程应用
传统的Python编程在处理IO密集型任务时常常面临效率低下的问题,而异步编程和协程技术的引入为解决这一问题提供了有效的途径。本文将介绍Python中异步编程的基本概念,深入探讨asyncio库的使用以及协程在实际项目中的应用,旨在帮助开发者更好地理解和运用异步编程技术。
|
1月前
|
调度 Python
python协程—asyncio模块
python协程—asyncio模块
20 0
|
1月前
|
API 开发者 Python
深入浅出Python协程:提升并发编程效率
在当今高速发展的互联网时代,高并发成为了软件开发中的一个重要需求。本文将引领读者深入理解Python中的协程(Coroutine)概念,探讨其在并发编程中的应用及优势。我们将从协程的基础概念出发,通过实例讲解如何使用asyncio库来编写高效的异步代码。文章旨在帮助读者掌握协程的工作原理和使用方法,从而在实际开发中能够更好地利用Python进行高效的并发编程。
|
1月前
|
数据采集 调度 开发者
深入浅出Python协程:提升并发编程效率
本文旨在为读者揭开Python协程的神秘面纱,通过深入浅出的方式阐述其工作原理及应用场景。不同于传统的技术文章摘要,我们将以一种独特的视角,将协程比作一场精心编排的交响乐,其中每一个乐章都是一个独立的任务,共同演绎出并发编程的华丽篇章。文章将从协程的基本概念切入,通过对比线程和进程,逐步深入到事件循环、异步IO等核心机制,最后通过案例分析,让读者能够掌握使用Python协程处理高并发任务的技巧,从而提升编程效率。
|
1月前
|
程序员 开发者 Python
深入浅出Python协程:提升代码效率的秘诀
【2月更文挑战第12天】 在当今追求高效编程的时代,Python协程成为了开发者提升代码执行效率的重要工具。本文将以通俗易懂的方式,深入探讨Python协程的原理、使用方法及其在实际开发中的应用场景。通过对比传统同步编程和异步编程的差异,我们将揭示协程如何在不牺牲代码可读性的前提下,显著提高程序的运行效率。文章旨在为Python开发者提供一份全面、实用的协程学习指南,帮助他们在实际项目中更好地利用这一强大的特性。
22 2

相关实验场景

更多