协程的优势

来源:10-2 go语言的调度器

198703

2020-04-04

相对于线程,协程对资源的利用率更高,其他语言应用层大量的创建线程,但是真正并发执行的只是CPU核数个,其他线程都处在sleeping的状态,还设计到线程的切换,所以对资源的利用率很低,我们线上服务器java一个服务有1500个线程,但是running的是最高就8个。

但是我有一个疑问?
线程是抢占式公平的, 多个线程池之间是有隔离的效果的。
但是如果用协程,非公平、非抢占式,会不会造成某一个协程被“饿死” ?

写回答

1回答

ccmouse

2020-04-05

理论上在go13及之前,如果你的一个goroutine占着cpu,的确有可能饿死其他goroutine,就像我这里做的实验那样。
但现实中,造成切换的点其实非常多,我在本节中有罗列,只要不是cpu运算量很大,不用担心。
go14加入了可剥夺调度,如果真的有运算量很大的情况,可以观察一下。
不过你的情况有那么多线程等在那里,用goroutine语言应该能显著减少开销

1
3
ccmouse
回复
198703
是剥夺。你试试把runtime.GOMAXPROCS设为1,也可以剥夺。
2020-04-06
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程