work steal如何实现随机偷取一个P的goroutine

来源:1-4 Go 程序是怎么跑起来的

softtr

2021-06-10 16:35:05

http://img.mukewang.com/climg/60c1cd7d09db1e2315800848.jpg

我找了一下源码,感觉应该是这里,但是看了很多遍没能理解这段注释的意思

写回答

1回答

Xargin

2021-06-10

这个是个数学性质,假设元素总共有 Y 个,

我们选择一个数字和 Y 互质,比如 X,

然后选一个起始位置:i

然后用下面这样的代码:

for j := i;;j+= X {
   pos := j % Y
}

可以把 Y 个元素全部遍历一遍,

且不重复


比如你有 4 个元素,我选 X = 3,3 和 4 互质,选起始位置 0


那么我的遍历位置分别为:


(0+3)%4 = 3

(3+3) % 4 = 2

(6+3) %4  = 1

(9+3) %4 = 0


这样看起来是个伪随机序列,能把 4 个元素都遍历完



你可以自己实验一下~其它的 x 和 y~

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程