Функция append () в go atomic / thread сохранена? - PullRequest
0 голосов
/ 13 декабря 2018

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

Сохранена ли эта тема или она может взорваться в моей руке?

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))
  }
}

1 Ответ

0 голосов
/ 13 декабря 2018

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

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()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...