0

Quartasyncio是一个 Python Web 框架,它在 Python 的协程系统之上重新实现了 Flask API 。在我的特殊情况下,我有一个 Quart websocket 端点,它应该不仅有一个传入事件源,还有两个可能的事件源,它们应该继续异步循环。

具有一个事件源的示例:

from quart import Quart, websocket
app = Quart(__name__)

@app.websocket("/echo")
def echo():
    while True:
        incoming_message = await websocket.receive()
        await websocket.send(incoming_message)

取自https://pgjones.gitlab.io/quart/

这个例子有一个来源:传入的消息流。但是,如果我有两个可能的来源,一个是await websocket.receive(),另一个是类似的东西,那么正确的模式是什么await system.get_next_external_notification()

如果其中任何一个到达,我想发送一条 websocket 消息。
我想我必须使用asyncio.wait(..., return_when=FIRST_COMPLETED),但是我如何确保我没有错过任何数据(即对于几乎同时完成的比赛条件)websocket.receive()system.get_next_external_notification()在这种情况下,正确的模式是什么?

4

1 回答 1

1

您可以使用的一个想法是使用队列将来自不同来源的事件连接在一起,然后让异步函数在后台侦听该队列以获取请求。这样的事情可能会让你开始:

import asyncio
from quart import Quart, websocket
app = Quart(__name__)

@app.before_serving
async def startup():
    print(f'starting')
    app.q = asyncio.Queue(1)
    asyncio.ensure_future(listener(app.q))

async def listener(q):
    while True:
        returnq, msg = await q.get()
        print(msg)
        await returnq.put(f'hi: {msg}')

@app.route("/echo/<message>")
async def echo(message):
    while True:
        returnq = asyncio.Queue(1)
        await app.q.put((returnq, message))
        response = await returnq.get()
        return response

@app.route("/echo2/<message>")
async def echo2(message):
    while True:
        returnq = asyncio.Queue(1)
        await app.q.put((returnq, message))
        response = await returnq.get()
        return response
于 2021-07-14T08:29:03.213 回答