理解 goroutine

【编者的话】虽然已经有很多解释goroutine的优秀文章,但是对于初学者来说,大多都比较晦涩难懂,在这里总结一下自己对goroutine的理解以及相关资料

Goroutine

  • Goroutine vs Thread - 推荐视频

  • Understanding Channels - 推荐视频

  • Goroutines 既不是OS 线程,也并非Green 线程

  • Goroutines是更高层次的coroutines(协程)抽象

  • Goroutine是并发的子程序(函数、闭包、方法),它们是nonpreemptive(非抢占式的) - 不能被中断。相反,协程有多个可允许中断或重入的点。

  • Go运行时观察Goroutines的状态,当阻塞时自动暂停它们,当它们非阻塞后又重新开启。这样Goroutine就是抢占式的协程,而且只有当它们阻塞时。

  • 运行goroutines的机制是由M:N调度器实现的,该调度器将M个green线程映射到N个OS线上,然后将Goroutines调度到green线程上。

  • 当goroutines多于可用的green线程,调度器将在可用的线程中处理goroutines的分布确保当某些goroutines阻塞时,其他的goroutines依然可以执行。

Work Stealing

  • fair scheduling
    n个处理器, x个任务:每个处理器分配x/n个任务

Scheduler

  • G go协程
  • M OS线程(源代码中表示machine)
  • P context(源代码中表示processor)
<Golang Tips> 理解 goroutine_第1张图片
  • GOMAXPROCS 控制着有多少context被用于运行时

<待续>


References:

  • c08s10 - Goroutine vs Thread (golang)
  • GopherCon 2017: Kavya Joshi - Understanding Channels
  • Concurrency in Go: Tools and Techniques for Developers 1st Edition
  • Coroutines
  • Green threads
  • Go 线程调度器

你可能感兴趣的:( 理解 goroutine)