Есть ли append () в сохранении атомарного / потока?

Прочитав пару списков, я хочу сложить все строки из каждого списка в один большой массив. Я запускаю каждого средства чтения списков в его собственной горутине. Могу я просто добавить строку, как только она будет прочитана?

Эта ветка спасает или это может взорваться у меня в руке?

type listHolder {
  entries []entry
}

func (h *listHolder) readAllLists(s []list) {
  c := make(chan list)
  var wg sync.WaitGroup

  for _, l := range s {
    wg.Add(1)
    go h.readSomeList(&wg, l)
  }

  c.close()
  wg.Wait()  
}

func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
  defer wg.Done()
  for e := range extractEntry(l) {
    h.entries = append(h.entries, newEntry(e))
  }
}

Никакие значения в go не являются безопасными для одновременного чтения и записи. Никакие функции и методы не задокументированы как таковые.

JimB 13.12.2018 16:29

Кроме того, если вы выполните поиск по любым другим вопросам Is X atomic in Go?, все они будут содержать ссылки на соответствующую документацию. Я не думаю, что нам нужен вопрос о Is X atomic in Go? для каждого возможного X, когда ответ один и тот же.

JimB 13.12.2018 17:05
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
2
253
1

Ответы 1

Что-то вроде этого было бы нормально. Или вы можете придумать другую архитектуру, например, использовать канал для подачи обновлений в одноразовую процедуру.

type listHolder {
  entries []entry
  m sync.Mutex
}

func (h *listHolder) readAllLists(s []list) {
  c := make(chan list)
  var wg sync.WaitGroup

  for _, l := range s {
    wg.Add(1)
    go h.readSomeList(&wg, l)
  }

  c.close()
  wg.Wait()  
}

func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
  defer wg.Done()

  for e := range extractEntry(l) {
    h.m.Lock()
    h.entries = append(h.entries, newEntry(e))
    h.m.Unlock()
  }
}

Другие вопросы по теме