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语言教程

更多相关文章

  1. golang是多线程模式吗?
  2. 深入SQLite多线程的使用总结详解
  3. XML中的树形结构与DOM文档对象模型的示例代码(图)
  4. 关于SQLite多线程的用法详解
  5. Redis 哈希结构内存模型剖析
  6. 没想到,这么简单的线程池用法,深藏这么多坑
  7. 《趣说前端 - 002 》— 两种作用域模型介绍
  8. HCIA-以太网帧结构-OSI模型
  9. 5个小技巧彻底搞懂JVM内存模型【针对3年以上Java开发】

随机推荐

  1. Android 设置系统SystemUI 顶部StatusBar
  2. Android之发送短信和接收验证码
  3. android应用去掉title bar 及全屏处理方
  4. Android 各种基础控件布局
  5. Android 8、Android 9获取手机序列号的兼
  6. Android(安卓)开源组件和第三方库汇总
  7. Kernel.org hacked – how to get Androi
  8. Android(安卓)-- Intent
  9. Android 实现全屏和无标题栏的显示
  10. Google Android(安卓)SDK开发范例-------