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

发布于 1周前 作者 sinazl 来自 Go语言

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

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

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

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

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

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


更多关于Golang Go语言中,请教各位大佬, chan <- 1 阻塞和阻塞结束的时候, goroutine 在干嘛?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

(我的一些理解, 错了欢迎指正)

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

A: 不会, 这个 G 会被打包成 sudog, 绑定在这个 chan 的相关 sudog 队列上, 等到下次有人从这个 chan 里取数据, 就遍历这个 sudog 队列, 找到这个沉睡的 sudog, 把里面的 G 唤醒, 再放到 P 上去运行

更多关于Golang Go语言中,请教各位大佬, chan <- 1 阻塞和阻塞结束的时候, goroutine 在干嘛?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 嗯…sudog,对于我来说是个新东西,得去了解下了

在Golang(Go语言)中,chan <- 1 表示向一个通道(channel)发送数据。理解通道操作中的阻塞现象是掌握Go并发编程的关键之一。

当你执行 chan <- 1 时,如果通道是未缓冲的(即没有设置缓冲区大小),或者通道的缓冲区已满(对于带缓冲的通道),发送操作将会阻塞,直到有另一个goroutine在该通道上执行接收操作(<- chan),从而腾出空间或允许数据被发送。

在阻塞期间,执行发送操作的goroutine会暂停执行,不会占用CPU资源进行无意义的循环等待。Go的运行时系统会有效地管理这些goroutine的调度,确保当条件满足(即通道可以接收数据时)发送操作能尽快继续执行。

阻塞结束时,意味着通道已经成功接收了数据(对于未缓冲通道)或找到了空闲的缓冲区空间(对于带缓冲通道)。此时,发送数据的goroutine会从阻塞状态恢复,继续执行其后续的代码。

值得注意的是,Go的通道机制设计得非常高效,旨在简化并发编程中的同步问题,同时避免传统多线程编程中常见的复杂性和错误。通过通道的阻塞与解除阻塞机制,Go语言能够自然地实现goroutine之间的同步和通信,使得编写并发程序变得更加直观和安全。

回到顶部