Твой код расистский. Несколько процедур пишут в resp
без какого-либо взаимного исключения, поэтому вы теряете данные.
Вы можете добавить мьютекс-блокировку-разблокировку вокруг этого. Тем не менее, код, который вы имеете в goroutine, не гарантирует его собственную goroutine, потому что это простое дополнение карты. Работать с этим кодом в goroutine будет намного проще, и, вероятно, он будет работать намного быстрее без затрат на планирование goroutine. Если вы не планируете иметь больше логики c в этой процедуре, я предлагаю вам удалить ее.
Вот еще немного информации о том, что, вероятно, происходит: прежде всего, в текущей версии go, программа будет уступать другим только тогда, когда эта программа вызывает некоторые функции библиотеки. Глядя на код, маловероятно, что ваши горутины когда-нибудь дадут. Поскольку вы уже наблюдали потерю данных (что означает, что существует состояние гонки), у вас, вероятно, более одного ядра.
Гонка здесь:
resp = append(resp, respRow)
Без взаимного исключения, одна программа может посмотреть на resp
, видит, что может записать в свой n
-й элемент. Другая программа (работающая на отдельном ядре) может сделать то же самое и успешно записывает туда. Но первая программа все еще думает, что элемент пуст, поэтому перезаписывает его и обновляет resp
. Когда это происходит, вы теряете один элемент.
Если вы добавите взаимное исключение в этот код, вы по существу заставите все программы запускаться последовательно, потому что они на самом деле ничего не делают. Кроме того, поскольку порядок выполнения goroutine является случайным, вы получите случайный порядок resp
. Короче говоря, это один из тех случаев, когда вы должны выполнять код последовательно.