Я искал эквивалент try_recv()
в futures::channel::mpsc::Receiver
и не смог его найти. Есть один? Есть try_next()
, но я не думаю, что он делает то, что я хочу. Я, конечно, не хочу, чтобы он вызывал pani c, если я вызываю его несколько раз на пустом канале.
В качестве альтернативы, можно ли использовать std::sync::mpsc::channel
в asyn c код, пока я никогда не делаю блокировку чтения на канале (т.е. всегда использую try_recv()
)? Как насчет отправки на него из асинхронной функции c и его использования в потоке syn c?
Вот еще немного подробностей о том, что я пытаюсь сделать:
Я создаю игру, в которой игроки подключаются к серверу через веб-сокет. Сторона веб-сокета будет asyn c, и каждое соединение будет вызывать задачу l oop для входящих сообщений и помещать их в канал. Мне нужен совет по поводу этого канала - должен ли он использовать futures::channel::mpsc::channel
(и сделать игру l oop asyn c - но см. Вопрос 1) или std::sync::mpsc::channel
(см. Вопрос 2).
Игровой движок будет работать в отдельном потоке и будет проверять входы игроков на этом канале (у каждого игрока есть свой канал) один раз за кадр. Я хочу избежать возможности того, что плохой (или медленный) клиент веб-сокета может затопить соединение и замедлить основной игровой движок, поэтому я хочу обрабатывать только одно входящее сообщение на кадр для каждого канала игрока. Если собственный канал игрока заполняется, они только вредят себе. Но проверка на одно входящее сообщение на кадр должна быть неблокируемой, потому что она запускается внутри игры. L oop.
Так что, как указано выше в вопросе 2, будет ли работать следующий код?
Asyn c websocket -> syn c channel -> syn c game l oop (и наоборот)