Python 3.4+Асинхронное программированиепонятие
asyncio.StreamReader
потоки ввода-вывода
Читающая половина асинхронного соединения: read(), readline(), readexactly(), readuntil(). Её возвращают asyncio.open_connection() и start_server().
Синтаксис
reader, writer = await asyncio.open_connection(host, port); line = await reader.readline()
read(n) возвращает до n байт — сколько уже пришло, а не ровно n; ровно n даёт readexactly(n), который при обрыве бросает IncompleteReadError. read() без аргумента ждёт конца потока, а не конца строки, и на живом соединении может висеть вечно. readline() оставляет b'\n' на конце и на EOF возвращает b'' без ошибки. Создавать StreamReader() руками не нужно.
Примеры
import asyncio
import socket
async def main():
left, right = socket.socketpair() # локальная пара сокетов вместо сети
reader, writer = await asyncio.open_connection(sock=left)
right.sendall(b'first\nsecond\n')
right.close()
print(await reader.readline()) # → b'first\n'
print(await reader.readline()) # → b'second\n'
print(await reader.readline(), reader.at_eof()) # → b'' True
writer.close()
await writer.wait_closed()
await asyncio.sleep(0.01)
asyncio.run(main())
import asyncio
import socket
async def main():
left, right = socket.socketpair()
reader, writer = await asyncio.open_connection(sock=left)
right.sendall(b'abc')
right.close()
try:
await reader.readexactly(5)
except asyncio.IncompleteReadError as e:
print(e.partial) # → b'abc'
writer.close()
await asyncio.sleep(0.01)
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности