"Должны ли работники получать доступ к одной и той же структуре (через указатель) для выполнения работы?"Нет, это не проблема.Было бы проблемой, если бы код внутри вашего обработчика получил доступ к критическому разделу , но я думаю, что это не вызывает блокировку вашей программы.
Ваш сервер не падает или не блокируется, потому что нетзапускается паника, и ваша программа слушает и выполняет по отдельным процедурам, которые являются легкими потоками выполнения.
Вероятно, это связано с каналами, которые вы используете для отправки и получения событий.
Отправка и получение на канал блокируются по умолчанию.Это означает, что когда вы отправляете или получаете от канала, он будет блокировать свои процедуры до тех пор, пока другая сторона не будет готова.
В случае буферизованных каналов отправляет блок, когда буфер заполнен,и получает блок, когда буфер пуст, как в вашем потоковом канале:
var stream = make(chan *Event, 100)
Вы сказали: «После того, как было запущено около 100 событий, слушатели перестают вызываться при публикации событий».
Так что если вы вызываете функцию Publish и делаете stream <- ev
, когда буфер канала «stream» заполнен, он будет блокироваться до тех пор, пока канал не найдет место для приема другого элемента.
Я бы предложил немного прочитатьо неблокирующих операциях канала .
Возможно, блокировка происходит в какой-то части вашего реального кода использования.