V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
koujyungenn
V2EX  ›  Go 编程语言

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

  •  
  •   koujyungenn · 2020-12-01 16:17:01 +08:00 · 1532 次点击
    这是一个创建于 1451 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    2 条回复    2020-12-02 09:10:09 +08:00
    xiaohanliang
        1
    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
        2
    koujyungenn  
    OP
       2020-12-02 09:10:09 +08:00
    @xiaohanliang #1 嗯....sudog,对于我来说是个新东西,得去了解下了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2683 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:27 · PVG 08:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.