使用aiohttp.post如何将一些数据传递给迭代

时间:2016-10-28 06:15:58

标签: python-3.x python-asyncio aiohttp

根据文档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())

1 个答案:

答案 0 :(得分:0)

嘿,while中的stream_coroutine()循环在哪里? 为什么你只读一次?

还应该调用协程:data=stream_coroutine()而不是data=stream_coroutine