关于线程和协程

来源:1-4 Go 程序是怎么跑起来的

panccvv

2021-05-16 17:07:43

曹大,怎么通俗易懂理解线程和协程,网上搜一堆说的不明不白

写回答

1回答

Xargin

2021-05-16

如果只是想理解的话,g 就是一个计算任务


用户代码里写:

```

go func() {

    xxxx

}()

```


的时候,是希望 runtime 把这个 go func 里面的代码执行完。任务在执行的过程中需要一些资源,资源可以分两种:

  1. 栈,我的 goroutine 里发生函数调用,需要给被调用的函数分配栈空间(stack frame),这部分分配工作是由 runtime 管理的

  2. 堆,在任务执行的过程中,有一些变量需要被分配到堆上,这部分工作也是 runtime 管理的


m 是实际的线程,和其它语言的线程完全一样,他主要的职责不断执行调度循环,这个循环的任务就是从队列中取出用户提交过来的 g,并且执行


概念上这样就可以理解了,实际上很多人还会比较线程和 goroutine 的资源开销以及切换成本,我个人觉得这没啥意义。。不过还是列在 ppt 上了

2

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程