为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不执行我所有的戈鲁丁?需要解释

为什么不执行我所有的戈鲁丁?需要解释

Go
芜湖不芜 2022-08-15 10:48:50
 func main() {    var wg sync.WaitGroup    ch := make(chan int,5)    start:= time.Now()    cnt:=0    wg.Add(10000)    for i:=0; i<10000; i++ {        ch <- 1        go func() {            defer wg.Done()            doSomething()            cnt++            <-ch        }()    }    wg.Wait()    fmt.Println(cnt)    end:= time.Now()    fmt.Println("End of program.",end.Sub(start))}在这里,我想同时执行程序,并且我还希望最多有5个goroutines。问题是当我打印出“cnt”时,它不会是10000。这意味着我有一些没有被执行的goroutines。如何解决此问题?现在我正在使用互斥体来解决这个问题,但是这个程序的运行时不会更好,我不明白为什么。    func main() {    var wg sync.WaitGroup    var mutex sync.Mutex    ch := make(chan int,5)    start:= time.Now()    cnt:=0    for i:=0; i<10000; i++ {        wg.Add(1)        ch <- 1        go func() {            defer wg.Done()            defer mutex.Unlock()            mutex.Lock()            doSomething()            cnt++            <-ch        }()    }    wg.Wait()    fmt.Println(cnt)    end:= time.Now()    fmt.Println("End of program.",end.Sub(start))}
查看完整描述

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))

}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信