简单理解什么是协程

Posted by SFHJavaer on 2024-08-15
Estimated Reading Time 1 Minutes
Words 514 In Total
Viewed Times

1. 多线程中的切换

假设有两个线程:

  • 线程 A:负责播放歌曲。
  • 线程 B:负责下载歌曲。

如果 线程 B 由于 I/O 阻塞(比如下载过程中等待服务器响应)而暂停,那么操作系统会进行 线程切换。操作系统会将 CPU 的控制权交给 线程 A,这样 线程 A 就可以继续播放歌曲,不会因为 线程 B 的 I/O 阻塞而浪费 CPU 资源。

这种切换是操作系统层面的,通常是由 时间片耗尽 阻塞状态 触发的,操作系统会管理这些线程的调度。线程 A 和 B 是两个独立的执行单元,线程 B 的 I/O 阻塞并不会影响线程 A 的运行。

2. 协程中的切换

在协程的情境下,假设你在 线程 B 中使用协程来处理下载任务,那么:

  • 协程 B1:负责下载歌曲。
  • 协程 B2:负责歌曲文件的处理(例如创建文件、编码等)。

如果 协程 B1 在下载时遇到 I/O 阻塞,程序并不会将整个线程 B 阻塞,而是会主动挂起(通过 <font style="color:rgb(36, 41, 47);">await</font> <font style="color:rgb(36, 41, 47);">yield</font> 协程 B1,然后调度执行其他协程。比如,程序可以启动 协程 B2 来执行文件创建或编码等工作。

所以,协程 B1 的阻塞 不会导致整个线程的阻塞,线程中的其他协程(如 B2)可以继续运行。

关键点:

  • 线程 B 可能会涉及多个协程(比如下载和文件处理),当 协程 B1 阻塞时,程序会主动将它挂起,并启动其他协程(如 B2)。这是由 程序控制的协程切换,而不是操作系统层面的线程切换。
  • 如果你有多个协程,可以在同一个线程内执行多个任务,避免 I/O 阻塞时浪费 CPU 资源。

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !