Неблокирующая запись по асинхронному каналу c? - PullRequest
1 голос
/ 07 марта 2020
  1. Я искал эквивалент try_recv() в futures::channel::mpsc::Receiver и не смог его найти. Есть один? Есть try_next(), но я не думаю, что он делает то, что я хочу. Я, конечно, не хочу, чтобы он вызывал pani c, если я вызываю его несколько раз на пустом канале.

  2. В качестве альтернативы, можно ли использовать 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 (и наоборот)

1 Ответ

1 голос
/ 08 марта 2020

Похоже, что try_recv() еще не реализовано для asyn c -std, хотя, кажется, что оно недалеко (в настоящее время рассматривается). https://github.com/async-rs/async-std/issues/579

Как уже упоминалось @Stargateur (см. Комментарии под оригинальным вопросом), реализация Topsio mps c поддерживает try_recv().

Я переключил свой код для использования Tokio 0.2 (и tokio_tungstenite для веб-сокетов), и он отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...