StreamReader és una classe del mòdul asyncio de Python utilitzada per a la lectura asíncrona de fluxos de dades. Forma part de l'abstracció d'streams d'alt nivell proporcionada per asyncio i permet llegir dades provinents de connexions de xarxa, canonades o altres fonts d'entrada sense bloquejar l'execució del programa.

Aquest mecanisme s’utilitza en el context de la programació asíncrona i de l'entrada/sortida no bloquejant, ja que permet que una aplicació continuï executant altres tasques mentre espera l'arribada de dades. StreamReader és habitual en aplicacions de xarxa implementades amb asyncio, especialment en clients i servidors TCP que necessiten gestionar diverses connexions concurrents dins d'un mateix bucle d'esdeveniments.

Funcionament StreamReader treballa conjuntament amb el bucle d'esdeveniments d'asyncio. Quan una connexió rep dades, el sistema operatiu notifica l'esdeveniment al bucle, que al seu torn emmagatzema les dades en un buffer intern associat a l'objecte StreamReader. Les corutines poden suspendre la seva execució mentre esperen dades i reprendre-la automàticament quan aquestes estan disponibles.

Normalment, un objecte StreamReader s’obté mitjançant funcions d'alt nivell com asyncio.open_connection() o asyncio.start_server(). Aquestes funcions creen automàticament els objectes necessaris per gestionar la comunicació asíncrona.

El model utilitzat evita la necessitat de comprovar constantment si hi ha dades disponibles. En lloc d'això, el programa queda suspès fins que el sistema operatiu indica que es pot continuar la lectura.

Mètodes principals StreamReader proporciona diversos mètodes per llegir dades de manera asíncrona:

read(n) llegeix fins a n bytes del flux. readline() llegeix una línia sencera acabada en caràcter de nova línia. readexactly(n) intenta llegir exactament n bytes i genera una excepció si el flux es tanca abans. readuntil(separator) llegeix dades fins que es troba un separador determinat. at_eof() indica si s’ha arribat al final del flux de dades.

Aquests mètodes són corutines i, per tant, s’utilitzen habitualment amb l'expressió await.

Relació amb l'E/S no bloquejant StreamReader està dissenyat per treballar sobre operacions d'entrada/sortida no bloquejant. En un model bloquejant tradicional, una operació de lectura pot aturar completament l'execució del programa fins que arriben dades. En canvi, en el model asíncron, la corutina que espera dades queda suspesa i el bucle d'esdeveniments pot continuar executant altres tasques concurrents.

Aquest enfocament és especialment útil en aplicacions amb moltes connexions simultànies, com servidors web, proxies o serveis de missatgeria. Mitjançant un únic fil d'execució, una aplicació pot gestionar nombroses operacions d'E/S sense necessitat de crear un fil independent per a cada connexió.

Relació amb StreamWriter StreamReader acostuma a utilitzar-se conjuntament amb StreamWriter, la classe encarregada de l'escriptura asíncrona de dades. Mentre StreamReader proporciona una interfície per llegir dades entrants, StreamWriter permet enviar dades cap a la connexió associada.

Aquest model separa clarament les operacions de lectura i escriptura i facilita la implementació de protocols de comunicació asíncrons.

Ús en bucles d'esdeveniments Els bucles d'esdeveniments d'asyncio poden utilitzar mecanismes de multiplexació d'E/S proporcionats pel sistema operatiu, com epoll, kqueue o select, per esperar notificacions de disponibilitat de dades. Quan el sistema operatiu detecta que un sòcol té dades disponibles, el bucle d'esdeveniments desperta la corutina que estava esperant sobre l'objecte StreamReader.

Aquest model constitueix una de les bases de la concurrència orientada a esdeveniments i permet gestionar moltes operacions d'E/S dins d'un mateix procés.

Exemple d'ús El fragment següent mostra una connexió TCP asíncrona utilitzant StreamReader i StreamWriter: import asyncio

async def main(): reader, writer = await asyncio.open_connection( 'example.com', 80)

writer.write(b'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n') await writer.drain()

data = await reader.read(100)

print(data.decode())

writer.close() await writer.wait_closed()

asyncio.run(main()) En aquest exemple, reader.read(100) suspèn temporalment la corutina fins que arriben dades des del servidor remot.

Comparació amb altres mecanismes StreamReader proporciona una abstracció d'alt nivell sobre mecanismes d'E/S asíncrona més baixos. A diferència de les interfícies basades directament en descriptors de fitxer o selectors, permet treballar amb fluxos de dades sense gestionar manualment esdeveniments del sistema operatiu.

En nivells inferiors, asyncio pot utilitzar selectors com EpollSelector o KqueueSelector segons el sistema operatiu disponible.

Referències

«asyncio — Streams». Python 3 documentation. [Consulta: 11 maig 2026]. «selectors — High-level I/O multiplexing». Python 3 documentation. [Consulta: 11 maig 2026].

Vegeu també Programació asíncrona Async/await Bucle d'esdeveniments

Categoria:Python