根据文档on aiohttp here:我可以指定一个协同程序来提供数据,但是当我运行它时(下面的代码示例)它告诉我 TypeError:只有io.IOBase,multidict和(name,文件)允许对
我已经尝试了其他几种方法来实现这一目标,但一直遇到麻烦。
我想要实现的是我可以从命名管道中读取(这将有流媒体音频数据不断进入)。然后我想立即将其转发到Speech To Text API(在本例中为Watson)。
我的附加要求(重要的一点)是我无法阻止读取文件,因为如果我执行该名称管道的写入端(想想unix套接字),将阻止该程序并降低声音。
将文件句柄传递给异步http请求只是直接的,但是我没有机会检查和中断数据。我该怎么做?
#!/usr/bin/env python3
import asyncio
import aiohttp
import io
FILENAME = 'poem.txt'
my_buffer = io.BytesIO()
queue = asyncio.Queue()
with open(FILENAME, 'rb') as fd:
while True:
chunk = fd.read(50)
# do some processing on chunk (read audio level)
if (chunk):
asyncio.ensure_future(queue.put(chunk))
else:
print("we're out of the original file")
my_buffer.write(b'')
break
@asyncio.coroutine
def stream_coroutine():
print("read chunk")
chunk = yield from queue.get()
if (chunk == b''):
print("chunks out!!")
return
yield chunk
async def getPage():
print("queue len", queue.qsize())
await asyncio.sleep(2)
async with aiohttp.ClientSession() as session:
async with session.post('http://requestb.in/zq456szq', data=stream_coroutine) as resp:
print(resp.status)
print(await resp.text())
loop = asyncio.get_event_loop()
loop.run_until_complete(getPage())
答案 0 :(得分:0)
嘿,while
中的stream_coroutine()
循环在哪里?
为什么你只读一次?
还应该调用协程:data=stream_coroutine()
而不是data=stream_coroutine