本文将演示如果从多个goroutine安全地写入文件。
多个goroutine写文件
Golang 版本
1.12.1
前言
本文将演示如果从多个goroutine安全地写入文件。
实现
package main
import (
"fmt"
"io"
"os"
"sync"
)
type SyncWriter struct {
m sync.Mutex
Writer io.Writer
}
func (w *SyncWriter) Write(b []byte) (n int, err error) {
w.m.Lock()
defer w.m.Unlock()
return w.Writer.Write(b)
}
var data = []string{
"Hello!",
"Ola!",
"Ahoj!",
}
func main() {
f, err := os.Create("sample.file")
if err != nil {
panic(err)
}
wr := &SyncWriter{sync.Mutex{}, f}
wg := sync.WaitGroup{}
for _, val := range data {
wg.Add(1)
go func(greetings string) {
fmt.Fprintln(wr, greetings)
wg.Done()
}(val)
}
wg.Wait()
}
$ go run main.go
$ cat sample.file
Hello!
Ahoj!
Ola!
原理
并发写入文件是一个问题,最终可能会导致文件内容不一致。 最好使用Mutex
或任何其他同步原语同步写入文件。 这样,可以确保一次只能有一个goroutine能够写入文件。
上面的代码创建了一个带有Mutex
的Writer
,它嵌入了Writer
(在本例中为os.File
),对于每个Write
调用,内部锁定Mutex
以提供独占性。 写操作完成后,Mutex
原语自然解锁。