2 回答
UYOU
TA贡献1878条经验 获得超4个赞
我不一定会说 Go 的select
实现很优雅,但我认为它以自己的方式很漂亮,并且经过了相当优化。
它
select
使用单个非默认情况对 s 进行特殊处理它改变了评估案例的顺序,以避免确定性饥饿
它对寻找已经满意的案例进行了乐观的第一次审核
它使用许多内部的,只有运行时机制知道的在每个通道的内部发送者/接收者队列中排队
它使用的
sudog
s 类似于轻量级 goroutine 引用(sudog
同一个 goroutine可以有多个s),允许快速跳转到 goroutine 堆栈它使用调度程序的
gopark
机制来阻止自己,从而允许有效地取消停放信号当发出信号并取消驻留时,它通过操纵
select
goroutine 的程序计数器立即进入触发的案例处理函数
实施中没有单一的总体突破性想法,但您会非常欣赏如何仔细修改每个步骤,使其快速、高效并与渠道概念很好地集成。正因为如此,select
用另一种语言重新实现 Go 的语句并不是很容易,除非你至少先有chan
构造。
您可以查看其他语言中可用的重新实现,其中的想法以不同程度的相似性和有效性重做。如果我必须select
用另一种语言从头开始重新实现,我可能会首先尝试一个共享信号量,如果这不起作用,则切换到一个更粗略的、稍微休眠然后签入随机顺序战略。
- 2 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消