BufferedWriter не работает при одновременном использовании - PullRequest
0 голосов
/ 16 марта 2019

Мне нужно записать большое количество данных в текстовый файл из нескольких программ (скажем, 30) одновременно.Я делаю вот что:

workers.Add(core.Concurrency)
    for i := 0; i < core.Concurrency; i++ {
        go func() {
            defer workers.Done()
            writer := bufio.NewWriter(f)
            defer writer.Flush()
            a.Worker(workChan, writer)
        }()
    }

Но в некоторых случаях это не работает.Здесь f - это объект *os.File.В некоторых случаях он вообще не записывает данные в файл, а в некоторых случаях записывает некоторые данные, но не выполняет записи в будущем.Поведение очень противоречиво и ошибок тоже нет.

Есть идеи, почему это может происходить?

1 Ответ

3 голосов
/ 16 марта 2019

Проблема в том, что у вас есть несколько процедур, пытающихся записать в файл одновременно, без какой-либо синхронизации. Это приведет к непредсказуемому порядку вывода и, возможно, к потере записи. Кроме того, использование буферизованного ввода-вывода помогает скрыть поведение.

Лучшее решение состоит в том, чтобы запустить одну процедуру, которая записывает в ваш вывод (с буферизованным вводом-выводом или без него, в зависимости от ваших потребностей), и чтобы все ваши сотрудники отправляли данные для записи в программу записи поверх канал.

...