только пару дней как начал знакомиться. Пишу сервак для ммо на го, общение с клиентом по тсп сокетам, ожидаю 1к конкурент коннектов. Как я себе представлял нормальное чтение: горутина проходит по всем *net.Conn, смотрит есть ли что-то для чтения. Если есть, читаем, если нет, идем к следующему.
Проблема: все риды - блокинг. Нет никакого Peek() или еще что-то, чтобы убедиться, что у нас есть сообщение.
В итоге либо: по горутине на каждый коннект, что мне кажется ПИЗДЕЦ??
Либо: шаманить с SetReadDeadline, ставить какой-то там дедлайн в 50 наносекунд?
Как правильно делается?
они вроде 4кб занимают так что можно не жадничать
посмотри в сторону - https://github.com/gobwas/ws
Открой 1000 горутин и все.
Горутина на коннект – нормально и удобно
так не пишут Go код. вы просто присваиваете каждому соединению горутину и она блокируется по мере чтения. Горутины очень дешёвые, это не потоки. В этом и есть прелесть Go.
Не так .... если сервер TCP то у тебя listen->accept-> и вот тут у тебя переданный конект(сокет) который и будет работать по синхронной или асинхронной логике
Обсуждают сегодня