Как отправлять сообщения клиентам с помощью websocket вне функций, украшенных `@app.websocket`?
Я использую Quart в качестве серверной части веб-игры. У меня есть заглушка цикла игровых событий и очереди приоритетов, когда что-то завершается из очереди приоритетов, игровой цикл выполняет дальнейшую обработку, а затем требуется отправить обновление игроку или игрокам. Вот упрощенная версия цикла игровых событий:
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, есть идеи, что мне нужно делать?