go基础库之多个goroutine写文件

本文将演示如果从多个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能够写入文件。

上面的代码创建了一个带有MutexWriter,它嵌入了Writer(在本例中为os.File),对于每个Write调用,内部锁定Mutex以提供独占性。 写操作完成后,Mutex原语自然解锁。