Многопоточный процесс записи данных в один файл может стать проблемой, которая закончится беспорядочным содержимым файла. Лучше синхронизировать процесс записи данных в файл с помощью использования Mutex
или какого-то другого инструмента для синхронизации горутин. В таком случае только одна горутина за раз сможет записывать что-то в файл. В данной инструкции показано, как сделать надежную запись в файл из нескольких горутин.
Записываем данные в файл из нескольких горутин
1. Создайте файл syncwrite.go
со следующим содержимым:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
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() } |
2. Запустите код через go run syncwrite.go
в главном терминале;
3. Проверьте содержимое созданного файла sample.file
:
Код из примера создает Writer
с помощью Mutex
, которая встраивает Writer
(os.File
в данном случае) и каждый вызов записи данных блокирует Mutex
для избежания одновременных процессов записи в файл. После завершения операции записи, примитива Mutex
освобождает и другая горутина может начать запись данных в файл.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»