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

Goroutines:在哪里关闭

Goroutines:在哪里关闭

Go
慕婉清6462132 2022-06-06 17:49:01
我很难理解我应该在哪里关闭我的频道。这段代码大约需要 0.7 秒:options := [3]string{"0", "1", "2"}str := fmt.Sprintf("%6d ", id)for j := 0; j < 40000; j++ {    str += options[rand.Intn(3)]}str += "\n"添加 io.Writestring 对时间没有影响,所以问题出在这一点。我想要大约 100,000 条这样的记录,所以我想放入一个 goroutine。func main() {    file, _ := os.Create("myfile.txt")    ch := make(chan string)    for i := 0; i < 100000; i++ {       go generate(i, ch)    }    counter := 0    for result := range ch {       counter++       io.WriteString(file, result)       if counter == 100000 {           close(ch)       }    }    file.Close()}func generate(id int, c chan string) {    options := [3]string{"0", "1", "2"}    str := fmt.Sprintf("%6d ", id)    for j := 0; j < 40000; j++ {        str += options[rand.Intn(3)]    }    str += "\n"    c <- str}据我了解,我正在关闭接收方的通道,这并不理想?此外,这样所有 100,000 应该首先发送到 goroutines,然后我才能收到任何。我可以发送请求以生成记录并同时开始接收吗?
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

使用计数器关闭您的频道不是一个好习惯。您可以使用sync.WaitGroup. 这使您可以更好地控制何时关闭频道:


func main() {


    var wg sync.WaitGroup


    ch := make(chan string)

    file, _ := os.Create("myfile.txt")


    for i := 0; i < 100000; i++ {

        wg.Add(1)


        go func(i int) {

            defer wg.Done()


            options := [3]string{"0", "1", "2"}

            str := fmt.Sprintf("%6d ", i)

            for j := 0; j < 40000; j++ {

                str += options[rand.Intn(3)]

            }

            str += "\n"

            ch <- str

        }(i)

    }


    go func() {

        wg.Wait()

        close(ch)

    }()


    for result := range ch {

        io.WriteString(file, result)

    }

    file.Close()

}


查看完整回答
反对 回复 2022-06-06
?
POPMUISE

TA贡献1765条经验 获得超5个赞

看看能不能解决你的问题。。


func main() {

    file, _ := os.Create("myfile.txt")

    ch := make(chan string)

    wg := new(sync.WaitGroup)

    for i := 0; i < 100000; i++ {

       wg.Add(1)

       go generate(i, ch)

    }


    go func(){wg.Wait();close(ch)}()


    counter := 0

    for result := range ch {

       counter++

       io.WriteString(file, result)


    }

    file.Close()

}


func generate(id int, c chan string) {

    options := [3]string{"0", "1", "2"}

    str := fmt.Sprintf("%6d ", id)

    for j := 0; j < 40000; j++ {

        str += options[rand.Intn(3)]

    }

    str += "\n"

    c <- str

    wg.Done()

}


查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号