1 回答
TA贡献1816条经验 获得超4个赞
尝试使用以下程序中的工人数量,看看哪个数字能给你最好的结果。虽然,你进行基准测试的方式并不是很可靠,通常应该避免。
但是这个程序应该更好地工作;肯定有更好的实现。所以在这里,你只是生成了大量的goroutines,但在你的情况下,这是goroutines,这真的没有必要,对于小案例;这是一个过度的。workers10000
注意:对我来说,这个程序的工作原理比你拥有的实现好>50%。
package main
import (
"fmt"
"sync"
"time"
)
type work struct {
wg *sync.WaitGroup
jobs <-chan struct{}
mu *sync.Mutex
val *int
}
// worker is responsible for executing the work assigned
func worker(w work) {
for range w.jobs {
w.mu.Lock()
*w.val++
w.mu.Unlock()
}
w.wg.Done()
}
func main() {
start := time.Now()
jobs := make(chan struct{}, 2) // Number of jobs (buffer)
workers := 2 // Number of workers
cnt := 0 // Shared variable among workers
work := work{
wg: &sync.WaitGroup{},
jobs: jobs,
mu: &sync.Mutex{},
val: &cnt,
}
// Worker Pool
work.wg.Add(workers)
for i := 0; i < workers; i++ {
go worker(work)
}
// Allocate jobs (Signal worker(s))
for i := 0; i < 10000; i++ {
jobs <- struct{}{}
}
// Ask the workers to stop
close(jobs)
work.wg.Wait()
fmt.Println(cnt)
fmt.Println("End of program: ", time.Since(start))
}
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报