goroutine是并行还是并发?

-1
小熊
小熊
管理员提问于6月前

Go语言交流群的朋友问到

对于我的 这篇文章 有一些疑问

主要是下面这句话:协程的缺点是无法利用多核资源:协程的本质是个单线程,它不能同时将 多个CPU用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。

> 问:如果开启10个协程,某个点就只有一个在运行?类似于系统的并发?

大家理解错了我的意思,这里是指协程不能使用多cpu,而不是指多协程不能使用多个cpu。这里会用到 GMP理论的这个图

goroutine是并行还是并发?

如果是单核就是排队,如果是多核就看p的调度,双核就是2个2个同时。

> 问:感觉10个协程的话 也是一个个排队的吧?

比较简单的说就是 进程是受到操作系统内核来进行调度的,线程是最小的运行单元。 线程和进程应该都是受到内核的管控的,根据优先级来进行分配。 协程的话是可以人为控制的,比如 go 就充分用了这个原理。

比如同时有100个线程,而os是 2cpu他不可能并行100个,实际上同时只有2个在并行。

如果不存在资源抢占,我们看起来是并行了100个实际上是在不断切换,速度太快了,肉眼看起来就像是同时运行了100个一样。就像一台电脑打开了浏览器 微信 ide实际上也是存在很多切换,看起来像多个程序同时在运行。

一个线程下的协程队列是并发的,而不是并行,在Go中,一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死。

关于http服务的,我们抛开协程不谈,实际上是多线程处理任务,只有一个线程监听了端口,当请求到来时创建一个子线程来处理请求来达到并行的效果。

换到go里面,把线程换成协程,就当时于同时有很多g,这又适用了gmp原理。