Python Glossary English

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Сообщить о неточности