kotlin之协程(Coroutine)是什么<一>

55 阅读14分钟

协程(Coroutine)是是什么?

协程(Coroutine)处理了什么问题?

协程(Coroutine)怎么实现的?

懵逼三连!!!! 一步步来吧,又是坑壁掉头发的一天.

本文纯概念知识点较多,看前记得清理下桌面,看最后掉了多少头发,记得评论区留下梳理

相关知识点:

  • 进程
  • 线程
  • 并发
  • 并行

哈哈哈哈哈,基操,疯狂打字中....产生结果---> 一堆头发...... 开始开始

1.协程是什么???

DeepSeek解释:

协程(Coroutine)是一种轻量级的并发编程模型,允许在单线程内通过协作式调度实现多任务的并发执行。与线程和进程不同,协程的切换由程序显式控制,而不是由操作系统调度,因此开销更小,效率更高。

豆包解释:

协程(Coroutine)是一种比线程更加轻量级的并发编程概念

维基百科

协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务子例程,允许执行被挂起与被恢复。相对子线程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛.

乱七八糟的结果,一脸懵逼的我...脑补中,那么到底协程是什么????

协程(Coroutine): 是一个比线程更轻量级的处理处理并发的技术(概念,组件,模型)

万恶之源,引发引入其他知识点,进程,线程,并发继续学习

2.协程(Coroutine)学习,关联知识点,进程,线程,并发,并行.

进程线程关系图

2.1 进程是什么

进程: 进程是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位.

个人理解: 当我们在系统中执行一个操作,系统会为我们实现操作准备一些内存以及其他资源,这个申请内存,cpu 以及执行具体业务逻辑的一系列执行的过程就叫进程.

我们写好的程序,在系统中加载,进行执行的的过程就叫进程,所以程序执行的过程叫做进程

系统实现一个功能需要,创建一个进程为载体,分配资源,之后才能实现具体的功能.进程是系统进行资源分配和调度的基本单位.

程序: 程序是静态的,它是存储在磁盘上的可执行文件(可以创建多个进程)

进程特点:

  • 并发性 在操作系统中,多个进程可以在同一时间段内并发执行。操作系统采用时间片轮转等调度算法,为每个进程分配 CPU 时间片,使得多个进程在宏观上看起来是同时运行的。例如,你可以一边用浏览器浏览网页,一边用音乐播放器播放音乐,这两个应用对应的进程就是并发执行的。
  • 动态性 进程是程序的一次执行过程,存在从创建到消亡的完整生命周期。它由操作系统创建,为其分配必要的资源,当进程完成任务或者出现异常时,会被操作系统终止并回收资源。例如,当你打开一个视频播放器播放视频,操作系统会创建相应进程;关闭播放器后,该进程就会结束。
  • 独立性(内存隔离) 每个进程拥有独立的系统资源,包括内存空间、文件描述符、网络连接等。这意味着一个进程不能直接访问另一个进程的资源,保证了进程间的相互隔离和安全性。例如,浏览器进程和文档编辑进程的内存数据是相互独立的,不会相互干扰。
  • 异步性 进程的执行顺序和执行时间具有不确定性,受到操作系统调度算法、系统负载以及外部事件等多种因素的影响。例如,两个并发的进程 A 和 B,它们的执行顺序可能每次都不同,可能 A 先执行一段时间,也可能是 B 先执行。
  • 结构性 操作系统为每个进程维护一个称为进程控制块(PCB)的数据结构。PCB 包含了进程的各种关键信息,如进程标识符、当前状态、程序计数器、寄存器值、内存指针、文件描述符表等。操作系统通过 PCB 来管理和调度进程,实现对进程生命周期的控制。

总结:

进程是程序执行的过程,是系统中资源分配和调度的基本单元,具有内存独立,并行,异步执行,有自己独立生命周期的特点

2.2 线程是什么

线程(Thread) 是系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.

进程是资源分配和调度基本单位,线程是运算的最小单位,需要在进程中创建,是具体执行功能的实际运作单位

线程特点:

  • 轻量级 相比于进程,线程的创建、销毁和切换开销较小。因为线程共享进程的资源,不需要像进程那样重新分配大量的系统资源。创建一个新线程的速度通常比创建一个新进程要快得多,而且线程之间的切换也更加高效。
  • 内存共享 线程之间可以方便地共享进程的全局变量、文件句柄等资源,这使得线程间的数据共享和通信更加容易。但同时也带来了数据同步和互斥的问题,因为多个线程同时访问和修改共享资源时,可能会导致数据不一致的问题。
  • 并发执行 同一进程内的多个线程可以并发执行,从而提高程序的执行效率。在多核处理器系统中,不同的线程可以同时在不同的 CPU 核心上并行执行,充分利用多核处理器的优势。例如,在一个图像处理程序中,可以使用多个线程同时处理不同区域的图像,加快处理速度。

总结:

一个功能的实现就是,系统创建一个进程分配资源,在进程中创建一个(或多个)线程负责具体的功能实现.线程具有 轻量级,内存共享,并行执行的特点

2.3 并发/并行又是什么???
  • 并行

并行指的是在同一时刻,多个任务真正地同时执行。这需要有多个处理单元的支持,比如多核 CPU 或多处理器系统。每个处理单元可以独立地处理一个任务,从而实现多个任务的同时进行。例如,在一个具有四个核心的 CPU 上,可以同时有四个不同的线程分别在四个核心上运行,这些线程的执行在时间上是完全重叠的。

  • 并发

并发强调的是在同一时间段内,系统能够处理多个任务。它并不要求这些任务在同一时刻同时执行,而是通过快速地在不同任务之间进行切换,使得从宏观上看起来多个任务是同时在执行的。在单核 CPU 系统中,同一时刻实际上只有一个任务在执行,但通过时间片轮转等调度算法,多个任务可以交替使用 CPU 资源,实现并发处理。例如,在一个单核 CPU 的计算机上,同时打开浏览器、音乐播放器和文本编辑器,操作系统会快速地在这几个应用程序的任务之间切换,让用户感觉它们是同时在运行的。

问题思考:

一个进程创建了一个线程去执行具体的逻辑,其他的逻辑就需要等待这个逻辑执行完再执行其他的逻辑,这时就造成了其他的逻辑等待的现象,所以就引出了并发的概念,我们是不是可以在主逻辑执行的时候,开启另外的内存去处理其他的逻辑.这种同时处理任务的技术就是并发技术.

并发实现

  • 多进程并发

    操作系统会创建多个进程,每个进程是程序在操作系统中的一次执行实例,拥有独立的内存空间和系统资源。进程之间通过进程间通信(IPC)机制进行数据交换和同步,常见的 IPC 方式有管道、消息队列、共享内存、套接字等。

  • 多线程处理并发

    在一个进程内部创建多个线程,这些线程共享进程的内存空间和大部分系统资源,但每个线程有自己独立的栈空间和程序计数器。线程之间通过共享变量进行数据共享,使用同步机制(如锁、信号量、互斥量等)来保证线程安全。

  • 协程处理并发

    协程是一种轻量级的线程,由程序自身进行调度。协程可以在一个线程内实现多个任务的并发执行,通过主动让出执行权来实现任务的切换。协程的上下文切换开销极小,因为它只需要保存和恢复少量的局部变量等信息。

总结:

并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。

并发就是通过一种算法将 CPU 资源合理地分配给多个任务 并行是多个任务在系统中同时运行,例如多核CPU运行单独的任务,相互不关联.

3.并发实现以及协程问题思考.

系统为了实现一个功能,执行一个一个程序,创建了一个进程(分配资源). 进程 创建了一个 线程 (执行单元,负责具体的执行).当一个线程太慢,其他任务需要同步执行,这就用到了并发.

3.1 并发实质就是多个任务同时执行.

问题1: 那么怎么实现线程并发???

既然并发是多个任务同时执行,在一个进程中,开启多个线程实现并发操作,通过保证线程安全,通过Handler实现线程通讯.就是实现了并发.

问题2: 开启多个线程能实现并发,那么单个线程能否处理并发呢??? 多个线程执行多个任务实现了并发,单个线程也能实现并发,协程就是单线程内实现并发的技术

3.2 协程技术

协程是一种在单线程内实现多任务的编程技术,它允许程序在执行过程中暂停当前任务,转而执行其他任务,然后再回来继续执行暂停的任务

4.协程是什么,解决了什么问题

回到初始问题协程是什么???

现在可以给出答案了(不容易啊!!!!)

协程是一种单线程内实现并发(多任务同时执行)的一种技术.

协程实现并发

优点

  1. 轻量级:协程是轻量级线程,创建、销毁开销远小于线程。如 Python 的 asyncio 库可轻松创建成千上万个协程,上下文切换无需复杂的内核态和用户态切换,速度极快,能在单线程内高效处理大量并发任务。
  2. 高并发处理能力:处理 I/O 密集型任务表现出色。以网络爬虫为例,协程发起网络请求后会主动让出执行权,让其他协程执行,避免阻塞,提高系统并发性能。
  3. 避免锁机制:采用协作式调度,同一时间只有一个协程执行,无数据竞争问题,无需锁机制,代码逻辑清晰,减少死锁和锁竞争带来的性能损耗,降低编程复杂度。
  4. 代码可读性好:可让异步代码以同步方式编写。如 Kotlin 中通过 suspend 函数封装异步操作,使代码执行流程直观,便于理解和维护。

缺点

  1. 单线程瓶颈:通常在单线程内运行,若线程被 CPU 密集型任务阻塞,所有协程都会受影响。如在协程中进行大量数学计算,会导致其他协程无法及时执行。
  2. 调试困难:执行流程复杂,多个协程切换和通信时,难以像调试同步代码那样直观定位问题,确定异常协程较难。
  3. 依赖特定编程模型:不同编程语言对协程支持和实现方式不同,开发者需学习特定编程模型和语法,增加学习成本。

使用场景

  • I/O 密集型任务:如网络爬虫、Web 服务器处理请求、数据库读写等场景,能在等待 I/O 操作时高效切换协程,提升整体性能。
  • 对资源敏感的环境:在资源有限的设备上,协程轻量级的特性使其可以创建大量并发任务而不会过度消耗系统资源。

多线程实现并发

优点

  1. 多核利用:可充分利用多核 CPU 优势,将不同任务分配到不同核心并行执行。如数据处理程序中,多个线程可同时处理不同数据块,提高处理速度,发挥硬件性能。
  2. 响应性好:在需及时响应用户操作的场景表现出色。如图形界面应用程序中,一个线程处理用户输入,另一个线程处理后台计算,避免界面卡顿,保证用户体验流畅。
  3. 系统调用支持:线程可直接进行系统调用与操作系统交互,处理文件读写、网络通信等需系统资源的任务时,能方便调用系统功能实现复杂任务。

缺点

  1. 线程安全问题:多线程同时访问共享资源易出现数据竞争、死锁等问题。如多个线程同时读写共享变量,可能导致数据不一致,需使用同步机制,增加编程复杂度和维护难度。
  2. 上下文切换开销:线程创建、销毁和切换需操作系统进行大量工作,频繁切换消耗大量 CPU 时间,降低系统性能,高并发场景下易成性能瓶颈。
  3. 资源消耗大:每个线程有独立栈空间和系统资源,线程数量增加会使内存和 CPU 资源消耗显著上升,过多线程可能导致系统资源耗尽。

使用场景

  • CPU 密集型任务:如科学计算、图像处理等,可将任务拆分为多个线程在多核 CPU 上并行执行,充分利用硬件资源提高计算速度。
  • 需要与操作系统深度交互的场景:如文件系统操作、网络套接字编程等,线程能直接进行系统调用,方便实现复杂功能。

总结

协程和多线程都是实现并发的有效手段,但各有优劣。协程以其轻量级、高并发处理 I/O 密集型任务的能力以及简洁的编程模型,在资源受限和 I/O 密集的场景中具有显著优势;而多线程则凭借对多核 CPU 的充分利用、良好的响应性和对系统调用的直接支持,更适合 CPU 密集型任务和需要与操作系统深度交互的场景。在实际开发中,需要根据具体的业务需求、任务类型和系统资源状况,合理选择使用协程或多线程,甚至可以将两者结合使用,以达到最佳的并发性能。

输入头发,输出结果.

协程是单线程实现并发的一种技术,具有轻量级,高并发,线程安全的特点