异步生成器函数到生成器函数?

时间:2021-01-26 08:51:38

标签: python async-await python-asyncio

我有一个 websocket 作为另一个任务运行。 此聆听任务使用生成器功能从麦克风流式传输音频。它阻塞了 websocket 任务,因此 websocket 任务无法 ping pong 服务器,我们断开连接。

audio_generator 必须是一个异步生成器,否则它会阻塞 websocket。 所以如果我让它异步,它会说异步生成器不可迭代。

这是因为生成器表达式不支持异步生成器?

异步更改前的原始代码:

 requests = (speech.StreamingRecognizeRequest(audio_content=content)
 for content in audio_generator) 
           // requests is a standard generator
responses = client.streaming_recognize(streaming_config, requests)

所以我将生成器表达式转换成这个

def responses_gen(audio_generator, speech):
    for content in audio_generator:
        yield speech.StreamingRecognizeRequest(audio_content=content)

像这样使用它

 audio_generator = stream.generator()
 requests = responses_gen(audio_generator, speech)

            responses = client.streaming_recognize(streaming_config, requests)

这不起作用。

无异常迭代请求!这意味着它可能无法理解我提供的 streaming_recognize 函数

请注意,audio_generator 使用一个 while True 循环,它带有一个 yield 和一个 asyncio.sleep(0.01)。

有什么好办法吗?我正在考虑使用一个线程,然后将结果发送到队列以供 websockets 任务接收,但我想避免这种情况。 如果这会干扰音频流的延迟,那么我想这是个好主意。

0 个答案:

没有答案