协程真正的作用是什么
这里我想出个判断题,看看大家想的是不是一致的
相对于线程来说,假设有很多请求,假设是 Golang 语言
- 协程处理 IO 很快
- 协程处理高并发很快
- 协程上下文开销很少
- 协程占用资源很少
这里面是都是正确的吗?
这里我想出个判断题,看看大家想的是不是一致的
相对于线程来说,假设有很多请求,假设是 Golang 语言
这里面是都是正确的吗?
感觉协程在 JS 来说可能语法上更加方便。
我可能看了一些奇怪的文章,说协程能提升 IO 速度搞得我十分困惑。我是觉得 IO 问题是多路复用解决的。
因为携程切换都是在用户态进行,所以速度很快,而且每次切换保留现场的资源很少
一百万 IO 任务需要处理
用线程解决,同时只能启动 1000 个
用协程解决,同时只能启动 100000 个
你猜,最后哪种解决方案先完成,先完成的解决方案,算不算快?
如果不考虑多路复用,协程会吊打线程。实际应用中,因为多路复用会导致两者差异并不是非常大。
但是如果线程与线程之间需要传输资源…差距又会被拉很大。
而且线程是比协程复杂的多的…玩的不好……就不用说了
其实在这里是有一个界限的,线程数量少的时候其实用多线程还是协程差别没那么大。但是当线程非常多,切换开销过大时,协程的优点才会显现,1,2,3,4 才会大致成立(比如大量 IO 请求)
其实对人类来说,协程才是我们最熟悉、用得最多的处理事情的逻辑。不如说大部分时候我们都是在用协程的思维在处理事情的。即便是对编程一无所知的大妈,平时做饭时都在用协程思维:在烤面包的空档去切菜做其他事情,而不是烤面包的时候就在那干等面包烤完。这就是典型的协程思维。 烤面包需要好几分钟,这好几分钟是白白干等的,相当于做 IO 请求( IO 请求和 cpu 处理速度相比是非常慢的)。这 IO 请求的空档 cpu 完全能去做其他事情而不是在那干等。
所以理解到这层之后,就会发现我们生活处处都是在用协程做事。然后什么情况协程比线程更好也能比较好判断了
讨论协程要区分一般意义上说的协程 和 go 语言的协程( goroutines )
一般意义上单线程里跑的协程是无法利用多个核心的资源的(毕竟开再多协程都是在一个线程里跑,没法利用多个核心)。解决办法就是开几个线程,把协程分配到这些线程里执行,这样就能完全利用 cpu 了
go 语言的协程就是后者,在协程的基础上自带调度器,会根据需求创建多个线程然后把协程分配到不同线程里运行,从而利用多个核心。写代码的人根本不用去纠结该开几个线程,每个协程该怎么调度