python 使用WebSocket的异步通信

lf5gs5x2  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(283)

我正在使用一个语音识别服务,它接受音频片段并返回一个文本转录。该服务是异步使用的,也就是说,当它接收音频数据时,它会回答部分文本识别,直到那时为止

仅仅使用一个简单的无限send_audio〉wait_response就会锁定程序,因为它等待服务不发送的应答。所以我尝试使用websockets,用协程来分离代码的发送和接收部分。但是我也没有太大的成功。

async def getMessages(ws):
    while 1:
        rcv = await ws.recv()
        ...

async def sendMessages(ws):
    while 1:
        await ws.send("CREATE_SESSION")
        ...

async def main():
    async with websockets.connect(ADDR) as websocket:
        sender = asyncio.create_task(sendMessages(websocket))
        getter = asyncio.create_task(getMessages(websocket))

        await asyncio.wait([sender, getter])

asyncio.run(main())

有更好的办法吗?我做错什么了?

htrmnn0y

htrmnn0y1#

因为您使用的是python,所以我建议您使用django-channels
如果你也把它部署到heroku,你会得到更快的结果
Cisco和许多其他公司都使用它

ehxuflar

ehxuflar2#

这个例子只是在定时器上打印文本或语音。它可以在两种情况下都工作得很好,即服务器发送更多的消息或客户端发送更多的消息。但是,有一个额外的延迟比睡眠时间提供的,我不清楚。

服务器

import asyncio
import websockets
import time

async def consumer_handler(websocket):
    tstart = time.perf_counter()
    async for message in websocket:
        message = await websocket.recv()
        print(f"{time.perf_counter() - tstart:0.2f} server got {message}")

async def producer_handler(websocket):
    while True:
        await websocket.send('TEXT')
        await asyncio.sleep(0.5)

async def handler(websocket):
    await asyncio.gather(
        consumer_handler(websocket),
        producer_handler(websocket),
    )

async def main():
    async with websockets.serve(handler, "localhost", 8765):
        await asyncio.Future()

if __name__ == '__main__':
    asyncio.run(main())

客户

import asyncio
import websockets
import time

async def consumer_handler(websocket):
    tstart = time.perf_counter()
    async for message in websocket:
        message = await websocket.recv()
        print(f"{time.perf_counter() - tstart:0.2f} client got {message}")

async def producer_handler(websocket):
    while True:
        await websocket.send('VOICE')
        await asyncio.sleep(0.1)

async def client(websocket):
    await asyncio.gather(
        consumer_handler(websocket),
        producer_handler(websocket),
    )

async def main():
    async with websockets.connect('ws://localhost:8765') as websocket:
        await client(websocket)

if __name__ == '__main__':
    asyncio.run(main())

相关问题