如何知道什么时候StreamReader的准备?(How to know when StreamRe

2019-09-30 00:19发布

我使用asyncio使TCP连接:

reader, writer = await asyncio.open_connection(addr)

我需要保持连接活着。 对于这一点,我存储一对(reader, writer)对未来的通信。 但是,我不知道什么时候reader有数据读取。 我可以用它做什么? 有没有一种方法,使一个处理器,当阅读器准备好了?

Answer 1:

但是,我不知道什么时候reader有数据读取。 我可以用它做什么?

要知道最明显的方式,当读者流具有数据读取是await它:

data = await reader.read(1024)

这要么返回数据向右走,或暂停当前协程,允许其他协程取得进展,并且只恢复这一项时,读者有一定的数据读取。 而不是存储用于未来通信的读/写的,你可以写一个协程, 了沟通,并存储任务驱动它:

async def communicate():
    reader, writer = await asyncio.open_connection(addr)
    # an echo server
    while True:
        line = await reader.readline()
        if not line:
            break
        writer.write(line)
        await writer.drain()  # backpressure, see https://tinyurl.com./hqylfay

task = loop.create_task(communicate())
# the task can itself be awaited, canceled, etc.

在ASYNCIO背后的想法流API是写这样的顺序看的代码,把它留给ASYNCIO处理文件描述符和任务调度的轮询。 您可以使用诸如组合程序asyncio.gatherasyncio.wait并行运行数千个这样的轻量级协程的。

有没有一种方法,使一个处理器,当阅读器准备好了?

如果你需要一个基于回调的API,你应该使用较低级别的传输和协议来代替。 但是,如果您已经在流工作,但仍偶尔也需要一个普通的回调,您可以通过获得获得它Future

future = asyncio.ensure_future(reader.read(1024))
future.add_done_callback(your_callback)

未来有相当于一个协程处理器的作用。 一旦read将不再块,在完成回调将由事件循环带一个参数,将来调用。 未来将已经完成,并且其result()方法可用于检索所接收的数据或异常。

(上述适用于在任何ASYNCIO协程或将来兼容的对象,而不是仅仅StreamReader方法。)



文章来源: How to know when StreamReader is ready?