我使用asyncio
使TCP连接:
reader, writer = await asyncio.open_connection(addr)
我需要保持连接活着。 对于这一点,我存储一对(reader, writer)
对未来的通信。 但是,我不知道什么时候reader
有数据读取。 我可以用它做什么? 有没有一种方法,使一个处理器,当阅读器准备好了?
我使用asyncio
使TCP连接:
reader, writer = await asyncio.open_connection(addr)
我需要保持连接活着。 对于这一点,我存储一对(reader, writer)
对未来的通信。 但是,我不知道什么时候reader
有数据读取。 我可以用它做什么? 有没有一种方法,使一个处理器,当阅读器准备好了?
但是,我不知道什么时候
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.gather
和asyncio.wait
并行运行数千个这样的轻量级协程的。
有没有一种方法,使一个处理器,当阅读器准备好了?
如果你需要一个基于回调的API,你应该使用较低级别的传输和协议来代替。 但是,如果您已经在流工作,但仍偶尔也需要一个普通的回调,您可以通过获得获得它Future
:
future = asyncio.ensure_future(reader.read(1024))
future.add_done_callback(your_callback)
未来有相当于一个协程处理器的作用。 一旦read
将不再块,在完成回调将由事件循环带一个参数,将来调用。 未来将已经完成,并且其result()
方法可用于检索所接收的数据或异常。
(上述适用于在任何ASYNCIO协程或将来兼容的对象,而不是仅仅StreamReader
方法。)