Он съедает весь ваш ЦП, потому что вы постоянно циклически проверяете сообщения в словаре, поэтому даже когда нет сообщений для обработки ЦП, или, по крайней мере, поток или ядро, работает на пределе. Вам нужно блокировать отправку и получение по каналам!
Я предполагаю, что вы делаете это, потому что вы не знаете, сколько будет каналов, и поэтому не можете просто select
на всех входных каналах. Лучше было бы запустить отдельную процедуру для каждого входного канала, который вы сейчас храните в словаре. Каждая процедура должна иметь цикл, в котором она блокирует ожидание входного канала и при получении сообщения выполняет блокировку отправки на канал клиенту, который является общим для всех.
Вопрос не полный, поэтому не могу дать точный код, но у вас будут программы, которые выглядят примерно так:
type Message struct {
id uint32,
message []float64
}
func receiverGoroutine(id uint32, input chan []float64, output chan Message) {
for {
message := <- input
output <- Message{id: id, message: message}
}
}
func clientGoroutine(c *Client, input chan Message) {
for {
message := <- input
// do stuff
}
}
(Вам также нужно добавить несколько готовых каналов)
В другом месте вы начнете их с кода, подобного этому:
clientChan := make(chan Message)
go clientGoroutine(client, clientChan)
for i:=0; i<max; i++ {
go receiverGoroutine( (uint32)i, make(chan []float64, clientChan)
}
Или вы можете просто запустить клиентскую подпрограмму, а затем добавить другие по мере необходимости, а не в цикле - это зависит от вашего варианта использования.