type
status
date
slug
summary
tags
category
icon
password
Property
Apr 19, 2025 06:37 AM
最近有人问起我关于Go语言中协程的设计初衷问题,正好说一下我对这个玩意的想法,同时这个也算是面试中可能会问起的问题。
从操作系统的层面上来在,线程是由内核创建和管理,运行在内核态的一种数据结构。协程是由用户创建和管理,运行在用户态的一种数据结构。
知道这点就基本了解了线程和协程的区别,那么问题来了,为什么要创建协程,用线程不好么,用线程的资源创建协程,资源使用率不就更加地下了么?
上面这个疑问,我最开始了解到协程这个概念的时候也有,不过随着接触的内容变多后就渐渐释怀了~
有一个IO模型的设计其实和协程的设计非常类似,这个东西叫做`epoll`,它的出现目的主要是解决了传统IO硬件利用率低下的问题。网络IO的特性,经常需要等待外部链路的传输延迟,这个延迟可能会有上百毫秒以上,甚至更高。而在计算机中,几百毫秒的时间片已经足够让CPU做很多事情了,所以才有了`epoll`:将大量的IO集中在一个线程上,让线程来轮询处理这些IO。
实际上协程也是类似,将多任务也就是协程集中在一个线程上,来达到节省资源的目的。
除此之外还有一个目的,那就是CPU基于每个线程的资源也就是时间片是不固定的,在用户态是无法控制这玩意的。
正好协程就实现在用户态,可以在用户态内进行资源的分配。
其实你可能已经见过协程类似的设计了,没错,Nginx当时也是这么设计的。
其实结论就比较明显了,协程在类似Web服务这种,IO并发数高,并且有延迟的这种环境,表现会非常出色。在桌面UI事件处理上我认为协程也会有不错的表现。
就这样吧,完。
- 作者:sdttttt
- 链接:https://www.sdttttt.site/article/19e0e50d-3291-80ba-ad89-f8d03a2ce685
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。