M
Published on
· Last modified on
· Public

coroutine实现的筛法取素数

不得不说这方法真TM巧妙,利用channel(go的chan就是从这来的 吧?)来传递要筛的数,每个素数是一层,在这层将当前素数的倍数划掉,将这层剩下的也就是不能被整除的数传给下一层,下层再传,依此类推。

不过这里有个地方很奇怪(这个程序的本意是求100以内的素数),main中的循环,for(i=2;;i++),明明没有必要传那么多,实际这个程序最终的退出是在primetask中的p>goal的taskexitall(0)这,当新得到的p是第一个大于goal的时候就会退出。但实际这样还是会造成浪费,在找到满足条件的p的时候,已经将多余的i压入了好多,比如goal是100,下一个素数是101,最终停止的时候,发现已经压到150+了。我将for改成了i<goal的条件,素数并没有输出到goal为止,还差了好多,加上sleep几秒后,就输出完了,说明for循环在将数放进channel后自己就退了,也就是说coroutine退了,可以将goal上限改得高点(比如10w)这样执行几次就很容易观察出最终输出的数并不一样。< p="">

源码请参考这里

Y
Published on

已星,求星https://www.textarea.com/yuxuangezhu/nodejs-yunxin...

Sign in or Sign up Leave Comment