170 похожих чатов

Всем привет, у меня есть вопрос на обсудить, про выполнение

длительных, неблокирующих операций.

Суть в том, что у меня есть однопоточное игровое ядро, очень похоже по своей сути на STA приложение вин форм. Это ядро обслуживает кучу клиентов, поэтому никогда не выполняет никаких длительных операций: т.е. у него есть входная очередь с событиями, которую оно разгребает и куча выходных очередей, в которые ядро кидает данные, которые нужно отправить игрокам.

А теперь задача: когда игрок подключается к серверу, нужно загрузить данные о нём с бд. Напрямую грузить нельзя, поэтому я сделал так, что запускается асинхронная операция загрузки, которая кидает в очередь сообщений данные о загруженном игроке. Вроде норм.

Но меня смущают некие маловероятные сценарии, типа: игрок подключился, отключился и вот наконец пришли данные о нём из базы. Или: игрок подключился, отключился, подключился и вот пришли данные о нём раз, и данные два, да ещё и порядок не детерминирован.

Для того чтобы не думать о таких сценариях, я решил что стоит сделать отмену асинхронной операции. Т.е. я говорю стороджу загрузить данные, стородж возвращает ид операции, если игрок отключился, то удаляем ид операции. Получается, что когда данные таки загрузятся из базы, можно понять нужны эти данные ещё или нет.

Отменять саму асинхронную операцию не вариант, т.к. она уже может завершиться, а данные уже попасть во входную очередь.

Проблема в том, что реализация пока получается не огонь :( а мне кажется, что проблема типовая для гуёвых программистов: типа грузим картинки в фоне, а если пользователь что-то нажал, то картинку уже не нужно грузить.

Что думаете? Может существует более простой способ, чем тот что я описал? Или есть готовые, удобные реализации, которые можно стырить?

2 ответов

3 просмотра

обычно просто используют отмену (cancellation токены), т.е. данные ты загрузил, но они не нужны уже (в токене была выставлена отмена) и дальше просто ничего не должно произойти

Мне кажется, ты правильно делаешь. Как минимум, в самом конце операции (когда ты уже завершил работу и находишься синхронно в ядре) нужно проверять, что игрок всё ещё подключен к серверу. Если не подключен — игнорировать результаты операции. Отменять in-flight операцию через cancellation token необязательно. Насколько я понимаю, ситуация это редкая, и ты рискуешь нагородить много кода ради копеечной экономии.

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
61
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Всем привет! поделитесь, пож-та, как кто дебажил / решал проблему с 504 Time out ошибкой от nginx, когда стучишься на свой vapor сервер? в логах /var/log/nginx/error.log е...
Paul
24
Привет всем. Не знаю, удачный ли чатик я выбрал для вопроса, но он как будто в целом про концепцию фп и конкретно про Haskell. Прочитал, что в целом в мире фп нет идеи мутабел...
Gellert Cringewald
15
Как добавить ссылку в Быстрый доступ в Проводнике windows 10? Нашёл, как на power shell сделать, но может есть способ через Дельфи?
А
31
@helgispbru @Dreamer_0x01 @Pathologic93 @webber_12 Не уверен, что вам всем это жутко интересно, но в продолжение недавнего диалога отправлю свои наброски. Хочу понять, правил...
Андрей [aharito] Харитонов
13
Карта сайта