golang不是单进程的,而是多线程;golang的线程模型是m p g模型,整体上go程与内核线程是多对多对应的,因此首先来讲就一定是多线程的。
golang不是单进程的,而是多线程。
golang有些所谓的m比n模型,m个线程下可以创建n个go routine,一般而言n远大于m,本质上属于多线程模型,但是协程的调度由go的runtime决定,强调开发者应该使用channel进行协程之间的同步。
至于线程,由于语言层面上不开放,你可以理解为其实是多协程模型,一个线程上可以创建若干个go routine,一般而言会创建与cpu核心数相同的线程数,当然实际上还是由runtime决定。
对于goroutine的调度,这个其实是一直在发展变化的,我只说一下gmp模型,goroutine在m个线程上运行,每次执行任务都会去查当前p(处理器)上的可执行队列,队列里面就是可以执行的goroutine,一旦当前p上没有可供执行的它就会去窃取另一个p的可执行队列中的goroutine。
而goroutine的创建理论上来说只受内存限制,一般而言最大也就2kb,对于一个线程2mb空间大小理论上来说可以轻易上1000个,当然这只是理想情况下,所以os线程数不会随着goroutine创建个数增加而增加。线程调度是对于go来说会比较耗费性能,频繁切换调度只会在goroutine之间存在,线程只会保持与cpu数相同的活跃线程数。
相关学习推荐:go语言教程
以上就是golang是单进程的吗?的详细内容。