1. recvq 和 sendq
recvq:recvq 是一个等待从 channel 接收数据的 goroutine 队列。当一个 goroutine 尝试从一个没有数据的 channel 接收数据时,这个 goroutine 会被阻塞,并且会被放入 recvq 队列中等待,直到有其他 goroutine 向该 channel 发送数据。
sendq:sendq 是一个等待向 channel 发送数据的 goroutine 队列。当一个 goroutine 尝试向一个已满(对于有缓冲 channel)或者没有接收者(对于无缓冲 channel)的 channel 发送数据时,这个 goroutine 会被阻塞,并且会被放入 sendq 队列中等待,直到有其他 goroutine 从该 channel 接收数据。
区别
用途不同:recvq 主要用于管理等待接收数据的 goroutine,而 sendq 主要用于管理等待发送数据的 goroutine。
触发条件不同:recvq 中的 goroutine 是因为尝试从空 channel 接收数据而被阻塞,sendq 中的 goroutine 是因为尝试向满 channel 或无接收者的 channel 发送数据而被阻塞
2. sendx 和 recvx
sendx:sendx 是有缓冲 channel 中用于记录下一次发送数据的索引位置。在有缓冲 channel 中,数据会被存储在一个环形数组中,sendx 表示下一个数据应该被存储的位置。
recvx:recvx 是有缓冲 channel 中用于记录下一次接收数据的索引位置。同样在有缓冲 channel 的环形数组中,recvx 表示下一个要被读取的数据所在的位置。
区别
用途不同:sendx 用于控制数据的发送位置,而 recvx 用于控制数据的接收位置。
操作不同:每次向有缓冲 channel 发送数据时,sendx 会更新到下一个位置;每次从有缓冲 channel 接收数据时,recvx 会更新到下一个位置。