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

2025-02-04  本文已影响0人  没有了遇见

协程(Coroutine)是是什么?

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

协程(Coroutine)怎么实现的?

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

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

相关知识点:

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

1.协程是什么???

DeepSeek解释:

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

豆包解释:

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

维基百科

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

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

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

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

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

image.png
2.1 进程是什么

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

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

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

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

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

进程特点:

总结:

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

2.2 线程是什么

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

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

线程特点:

总结:

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

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

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

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

问题思考:

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

并发实现

总结:

并发是针对单核 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. 依赖特定编程模型:不同编程语言对协程支持和实现方式不同,开发者需学习特定编程模型和语法,增加学习成本。

使用场景

多线程实现并发

优点

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

缺点

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

使用场景

总结

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

输入头发,输出结果.

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

上一篇 下一篇

猜你喜欢

热点阅读