使用 aiohttp.post 我如何传递一些数据进行迭代
Posted
技术标签:
【中文标题】使用 aiohttp.post 我如何传递一些数据进行迭代【英文标题】:With aiohttp.post how do I pass it some data to iterate 【发布时间】:2017-03-10 23:51:29 【问题描述】:根据文档on aiohttp here:我可以指定一个协程来提供数据,但是当我运行它时(下面的代码示例)它告诉我TypeError: Only io.IOBase, multidict and (name, file)允许配对
我已经尝试了其他几种方法来实现这一点,但总是遇到麻烦。
我想要实现的是我可以从命名管道中读取数据(这将不断地输入流音频数据)。然后我想立即将其转发到 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())
【问题讨论】:
【参考方案1】:嘿,stream_coroutine()
中的while
循环在哪里?
为什么只读一次?
还应调用协程:data=stream_coroutine()
而不是data=stream_coroutine
【讨论】:
以上是关于使用 aiohttp.post 我如何传递一些数据进行迭代的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 axios 将数组从 javascript 传递到 laravel 控制器