0

最近看了很多关于协程(coroutine)的文章,基本上都有提到一个好处:“因为是一个线程执行,所以不存在线程的切换,而是由程序自身控制,也就不存在所谓的线程切换的开销。”,我觉得这话存在不合理的地方,即时我们写得应用是通过协程(coroutine)实现,是单进程单线程的,但整个服务器不是只有我们自己写得应用一个process在跑(系统自带程序也会是一个process),每个process都必然占用CPU时间的,为什么就会不存在“线程切换的开销”呢?

StAR 10
2017-01-15 提问
2 个回答
1

协程这个概念容易被搞混,我估计你已经搞混了。协程只是一个异步控制流,本质上是 async/await 异步操作的变形,跟什么线程切换之类的没关系。

因为 linux 里在调度时对线程和进程进行了统一抽象,所以以下不区分两者的区别。

我估计你想问的是 Go 里 goroutine 跟进程的优劣。goroutine 的好处在于切换速度快于进程,举个例子,在网络编程的语境里,早期的编程模型是 one connection per thread,那就意味着有几个连接就要开几个线程,这就导致线程数非常多,来回切换的成本非常高。goroutine 的切换不用进入内核态,切换开销比较低。

至于开若干个线程,是为了充分利用多核,单线程是无法利用多核的。如果对性能的要求特别高,往往还会设置线程和 cpu 核的亲和性,保证线程不会被调度到其他的核上。在理想条件上,核数和线程数相同,每个线程就会始终在自己的核上跑,不发生任何切换。当然这是理想情况。

0

要在具体的语境中看问题,文中指的是在协程中切换比起同样的问题用线程解决省去了线程切换的开销,好比你用冲锋枪射击比手枪可以少换很多次弹夹,但是该甩手榴弹的时候还是要腾出手换装备。

撰写答案

推广链接