Goroutines:在哪里关闭

Goroutines:在哪里关闭,go,concurrency,goroutine,Go,Concurrency,Goroutine,我正在努力理解我应该在哪里关闭我的频道 这段代码大约需要0.7秒: 选项:=[3]字符串{“0”、“1”、“2”} str:=fmt.Sprintf(“%6d”,id) 对于j:=0;j

我正在努力理解我应该在哪里关闭我的频道

这段代码大约需要0.7秒:

选项:=[3]字符串{“0”、“1”、“2”}
str:=fmt.Sprintf(“%6d”,id)
对于j:=0;j<40000;j++{
str+=期权[rand.Intn(3)]
}
str+=“\n”
添加io.Writestring不会对时间产生影响,因此问题在于这一点

我想要大约10万张这样的唱片,所以我想放一张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
}
func main(){
文件:=os.Create(“myfile.txt”)
ch:=制造(成串)
对于i:=0;i<100000;i++{
去生成(i,ch)
}
计数器:=0
对于结果:=范围ch{
柜台++
io.WriteString(文件、结果)
如果计数器==100000{
关闭(ch)
}
}
file.Close()文件
}
func生成(id int,c chan字符串){
选项:=[3]字符串{“0”、“1”、“2”}
str:=fmt.Sprintf(“%6d”,id)
对于j:=0;j<40000;j++{
str+=期权[rand.Intn(3)]
}
str+=“\n”

看看这是否解决了你的问题

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()
}
func main(){
文件:=os.Create(“myfile.txt”)
ch:=制造(成串)
wg:=新建(sync.WaitGroup)
对于i:=0;i<100000;i++{
工作组.添加(1)
去生成(i,ch)
}
go func(){wg.Wait();close(ch)}()
计数器:=0
对于结果:=范围ch{
柜台++
io.WriteString(文件、结果)
}
file.Close()文件
}
func生成(id int,c chan字符串){
选项:=[3]字符串{“0”、“1”、“2”}
str:=fmt.Sprintf(“%6d”,id)
对于j:=0;j<40000;j++{
str+=期权[rand.Intn(3)]
}
str+=“\n”

c使用计数器关闭频道不是一种好的做法。您可以使用
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()
}
func main(){
var wg sync.WaitGroup
ch:=制造(成串)
文件:=os.Create(“myfile.txt”)
对于i:=0;i<100000;i++{
工作组.添加(1)
go func(i int){
推迟工作组完成()
选项:=[3]字符串{“0”、“1”、“2”}
str:=fmt.Sprintf(“%6d”,i)
对于j:=0;j<40000;j++{
str+=期权[rand.Intn(3)]
}
str+=“\n”

当发送方不再发送任何值时,您应该关闭发送方端。您可以同时发送和接收(在单独的goroutine中)。您可以在从缓冲通道接收到所有值之前关闭。此外,缓冲值仍将被接收。如果有多个发送方(如此处),请参阅。和,使用一个和一个单独的goroutine,当WaitGroup完成时关闭通道。解决方案有用吗?感谢您的详细回答!我不确定是否理解正确:我在
go func(){wg.Wait()…}
前面放置了一条print语句。似乎只有在所有100000条消息都发送到
go generate()之后才能完成打印