как отправлять сообщения клиентам с помощью websocket вне функций, украшенных `@ app.websocket`? - PullRequest
0 голосов
/ 22 мая 2019

Я использую кварт в качестве серверной части веб-игры.У меня есть заглушка цикла игровых событий и очередь с приоритетами, когда из очереди с приоритетами что-то завершается, игровой цикл выполняет дальнейшую обработку, а затем требуется отправить обновление игроку или игрокам.Вот упрощенная версия цикла игровых событий:

async def game_loop(
    pq_event: multiprocessing.connection.Connection,
    ws_event: multiprocessing.connection.Connection,
):
    while True:
        # FIXME: This may block the concurrency
        ready, _, _ = select([pq_event, ws_event], [], [])
        which = random.choice(ready)
        if which == pq_event:
            event = pq_event.recv()
        elif which == ws_event:
            event = ws_event.recv()

        # for now all events are printed
        print(event)

Я думал, что украшение game_loop с помощью quart.copy_current_websocket_context позволит мне использовать глобальный объект websocket для отправки материала игрокам, но это не так.дело:

Traceback (most recent call last):
  File "/usr/local/bin/backend-server", line 3, in <module>
    from backend import main
  File "/usr/local/lib/python3.7/site-packages/backend/main.py", line 7, in <module>
    from .loop import setup_pqueue, run_reactor, game_loop
  File "/usr/local/lib/python3.7/site-packages/backend/loop.py", line 53, in <module>
    ws_event: multiprocessing.connection.Connection,
  File "/usr/local/lib/python3.7/site-packages/quart/ctx.py", line 299, in copy_current_websocket_context
    raise RuntimeError('Attempt to copy websocket context outside of a websocket context')
RuntimeError: Attempt to copy websocket context outside of a websocket context

Действительно, я неправильно использую декоратор, однако чего я хочу добиться - это отправлять сообщения игрокам с помощью websocket, есть идеи, что мне нужно делать?

...