我想计算模运算中素数的逆元素。为了加快速度,我启动了几个 goroutine,它们试图在一定范围内找到元素。当第一个找到元素时,它将它发送到主 goroutine,此时我想终止程序。所以我调用close了主 goroutine,但我不知道 goroutines 是否会完成它们的执行(我猜不会)。于是出现了几个问题:
1)这是一种糟糕的风格,我应该有类似的东西吗WaitGroup?
2)是否有更惯用的方法来进行此计算?
package main
import "fmt"
const (
Procs = 8
P = 1000099
Base = 1<<31 - 1
)
func compute(start, end uint64, finished chan struct{}, output chan uint64) {
for i := start; i < end; i++ {
select {
case <-finished:
return
default:
break
}
if i*P%Base == 1 {
output <- i
}
}
}
func main() {
finished := make(chan struct{})
output := make(chan uint64)
for i := uint64(0); i < Procs; i++ {
start := i * (Base / Procs)
end := (i + 1) * (Base / Procs)
go compute(start, end, finished, output)
}
fmt.Println(<-output)
close(finished)
}
潇湘沐
蝴蝶不菲
相关分类