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