请教各位大佬, chan <- 1 阻塞和阻塞结束的时候, goroutine 在干嘛?

2020-12-01 16:17:01 +08:00
 koujyungenn

看了 MPG 模型,有些细节还是没懂。

假设 chan 是无缓冲通道,假设 G1 往 chan 里扔数据阻塞了。

此时会触发 Go 的 HandOff 机制,将 P1 detach()到其他 M 上吗?

如果会,过段时间另一个协程 G2 从 chan 里取数据,G1 的阻塞结束。G1 会直接进入某个 P 的协程队列尾(有空闲 P)或全局协程队列尾(无空闲 P)吗?还是说插队回到 P1 的队首?

还是说以上都不对,是另外一种做法?

1557 次点击
所在节点    Go 编程语言
2 条回复
xiaohanliang
2020-12-01 19:33:31 +08:00
(我的一些理解, 错了欢迎指正)

Q: 此时会触发 Go 的 HandOff 机制,将 P1 detach()到其他 M 上吗?

A: 不会, 这个 G 会被打包成 sudog, 绑定在这个 chan 的相关 sudog 队列上, 等到下次有人从这个 chan 里取数据, 就遍历这个 sudog 队列, 找到这个沉睡的 sudog, 把里面的 G 唤醒, 再放到 P 上去运行
koujyungenn
2020-12-02 09:10:09 +08:00
@xiaohanliang #1 嗯....sudog,对于我来说是个新东西,得去了解下了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX