使用 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 我如何传递一些数据进行迭代的主要内容,如果未能解决你的问题,请参考以下文章

如何将javascript变量传递给数据库

如何使用 axios 将数组从 javascript 传递到 laravel 控制器

如何将数据从一个视图传递到 IOS 中的另一个视图控制器?

如何使用 POST/form 叶模板传递数据?

如何在 PageViewController 和 ViewController 之间传递数据?

Angular如何将数据从指令传递到父组件