在goroutine中将字符串写入文件

时间:2016-01-15 06:13:31

标签: go io goroutine

我在代码中使用go例程如下:

c := make(chan string)
work := make(chan string, 1000)
clvl := runtime.NumCPU()

for i := 0; i < clvl; i++ {
    go func(i int) {
        f, err := os.Create(fmt.Sprintf("/tmp/sample_match_%d.csv", i))
        if nil != err {
            panic(err)
        }
        defer f.Close()
        w := bufio.NewWriter(f)
        for jdId := range work {
            for _, itemId := range itemIdList {
                w.WriteString("test")
            }
            w.Flush()
            c <- fmt.Sprintf("done %s", jdId)
        }
    }(i)
}


go func() {
    for _, jdId := range jdIdList {
        work <- jdId
    }

    close(work)
}()

for resp := range c {
    fmt.Println(resp)
}

这没关系,但是我可以只是写一个文件吗?就像这样:

c := make(chan string)
work := make(chan string, 1000)
clvl := runtime.NumCPU()
f, err := os.Create("/tmp/sample_match_%d.csv")
if nil != err {
    panic(err)
}
defer f.Close()
w := bufio.NewWriter(f)

for i := 0; i < clvl; i++ {
    go func(i int) {

        for jdId := range work {
            for _, itemId := range itemIdList {
                w.WriteString("test")
            }
            w.Flush()
            c <- fmt.Sprintf("done %s", jdId)
        }
    }(i)
}

这不起作用,错误:panic: runtime error: slice bounds out of range

1 个答案:

答案 0 :(得分:3)

  • bufio.Writer类型不支持并发访问。用互斥锁保护它。
  • 因为每次写入都会刷新短字符串,所以使用bufio.Writer是没有意义的。直接写入文件(并使用互斥锁保护它)。
  • 在文件关闭或程序退出之前,没有代码可以确保goroutine完成。使用sync.WaitGroup。