11/03/2026, 12:49 Python vs Rust Streaming
ChatGPT 5.4 Thinking Memória desativada
Sou programador Python aprendendo Rust, tenha ótima
didática e faça correlação entre as linguagens, mostre
como o rust trabalha comSou programador Python
aprendendo Rust, tenha ótima didática e faça correlação
entre as linguagens, mostre como o rust trabalha com
Streaming de dados
Pensou por 4 segundos
Perfeito. Vou te explicar Rust com foco em streaming de dados, sempre fazendo ponte
com Python, porque esse é o jeito mais rápido de você construir intuição sólida.
Visão geral
Quando você fala em streaming de dados, isso pode significar algumas coisas:
1. Ler dados aos poucos, sem carregar tudo na memória
Ex.: ler um arquivo grande linha por linha.
2. Processar dados contínuos
Ex.: mensagens chegando de socket, Kafka, serial, stdin, API, sensor IoT.
3. Transformar dados em pipeline
Ex.: filtrar, mapear, agregar, encaminhar.
Em Python, isso normalmente aparece com:
iteradores
generators ( yield )
asyncio
leitura de arquivos e sockets
Em Rust, isso aparece com:
Iterator
Read , BufRead
canais ( std::sync::mpsc , tokio::sync::mpsc )
async/.await
Stream com tokio-stream ou futures
[Link] 1/25
11/03/2026, 12:49 Python vs Rust Streaming
1. Primeiro paralelo mental: Python vs Rust
Python
Em Python, streaming costuma ser natural porque muita coisa já é iterável:
Python Executar
with open("[Link]", "r", encoding="utf-8") as f:
for linha in f:
print([Link]())
Aqui você já está processando em streaming:
o arquivo não precisa ser carregado inteiro.
Você também pode criar um gerador:
Python Executar
def numeros():
for i in range(10):
yield i
Rust
Em Rust, a ideia é parecida, mas com mais controle e segurança:
Rust
for i in 0..10 {
println!("{}", i);
}
Para leitura de arquivo em streaming:
Rust
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let file = File::open("[Link]")?;
let reader = BufReader::new(file);
for line in [Link]() {
let line = line?;
[Link] 2/25
11/03/2026, 12:49 Python vs Rust Streaming
println!("{}", line);
}
Ok(())
}
2. O que muda mentalmente do Python para Rust
Em Python
Você pensa:
“isso funciona?”
“a estrutura é iterável?”
“vou consumir isso com for ?”
Em Rust
Você pensa:
“quem é o dono desse dado?”
“estou emprestando ou movendo?”
“esse fluxo é síncrono ou assíncrono?”
“quero processar item por item ou em blocos?”
Essa diferença é crucial.
3. Streaming síncrono em Rust
Vamos começar do jeito mais simples.
Exemplo: ler arquivo linha por linha
Python
Python Executar
with open("[Link]", "r", encoding="utf-8") as f:
for linha in f:
if "ERROR" in linha:
print([Link]())
Rust
[Link] 3/25
11/03/2026, 12:49 Python vs Rust Streaming
Rust
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let file = File::open("[Link]")?;
let reader = BufReader::new(file);
for line in [Link]() {
let line = line?;
if [Link]("ERROR") {
println!("{}", line);
}
}
Ok(())
}
Correlação direta
open(...) em Python ↔ File::open(...) em Rust
for linha in f ↔ for line in [Link]()
if "ERROR" in linha ↔ if [Link]("ERROR")
4. Iterator: a base do streaming em Rust
Em Rust, Iterator é uma das peças centrais.
Python
Python Executar
nums = [1, 2, 3, 4, 5]
resultado = [x * 2 for x in nums if x % 2 == 0]
print(resultado)
Rust
Rust
fn main() {
let nums = vec![1, 2, 3, 4, 5];
let resultado: Vec<i32> = nums
.iter()
[Link] 4/25
11/03/2026, 12:49 Python vs Rust Streaming
.filter(|x| **x % 2 == 0)
.map(|x| x * 2)
.collect();
println!("{:?}", resultado);
}
O ponto importante
Em Rust, o pipeline de transformação funciona muito bem para streaming:
iter()
filter()
map()
take()
skip()
collect()
Mas existe uma diferença importante:
Em Python
As comprehensions normalmente geram resultado final logo de uma vez.
Em Rust
Os iterators são lazy, isto é, preguiçosos.
Eles só processam quando você consome o fluxo.
Isso é excelente para streaming.
5. Lazy evaluation: muito importante
Rust
Rust
fn main() {
let nums = vec![1, 2, 3, 4, 5];
let iter = [Link]().map(|x| {
println!("processando {}", x);
x * 2
});
println!("nada aconteceu ainda");
[Link] 5/25
11/03/2026, 12:49 Python vs Rust Streaming
for v in iter {
println!("resultado {}", v);
}
}
O que isso ensina?
O map() não executa na hora.
Ele só executa quando o iterator é consumido no for .
Em Python, comparação mental
Isso lembra:
Python Executar
gen = (x * 2 for x in [1, 2, 3, 4, 5])
Esse generator também é lazy.
Então a melhor ponte mental é:
Rust Iterator se parece mais com generator/composição lazy de Python
e menos com uma lista pronta
6. Ownership no streaming: onde Python e Rust mais
diferem
Aqui está uma das maiores viradas de chave.
Python
Python passa referências de forma bem flexível.
Você quase nunca precisa pensar explicitamente em “quem possui o dado”.
Rust
No streaming, isso importa o tempo todo.
Exemplo:
Rust
fn main() {
let nomes = vec!["ana".to_string(), "bia".to_string(), "caio".to_string()];
[Link] 6/25
11/03/2026, 12:49 Python vs Rust Streaming
for nome in nomes {
println!("{}", nome);
}
// println!("{:?}", nomes); // erro: nomes foi movido
}
Por quê?
Porque o for nome in nomes consumiu o vetor.
Se você quiser apenas emprestar:
Rust
fn main() {
let nomes = vec!["ana".to_string(), "bia".to_string(), "caio".to_string()];
for nome in &nomes {
println!("{}", nome);
}
println!("{:?}", nomes);
}
Correlação com Python
Em Python, isso seria invisível para você.
Em Rust, no streaming, você sempre decide entre:
mover o dado
emprestar o dado
mutar o dado
Essa disciplina torna processamento contínuo muito seguro.
7. iter() , into_iter() e iter_mut()
Isso é obrigatório para entender streaming em Rust.
iter()
Percorre por referência imutável.
[Link] 7/25
11/03/2026, 12:49 Python vs Rust Streaming
Rust
let v = vec![1, 2, 3];
for x in [Link]() {
println!("{}", x);
}
iter_mut()
Percorre por referência mutável.
Rust
let mut v = vec![1, 2, 3];
for x in v.iter_mut() {
*x *= 2;
}
println!("{:?}", v);
into_iter()
Consome a coleção.
Rust
let v = vec![1, 2, 3];
for x in v.into_iter() {
println!("{}", x);
}
// v não pode mais ser usado
Analogia com Python
Python não separa isso formalmente.
Em Rust, você precisa pensar:
quero só ler? → iter()
quero alterar? → iter_mut()
quero transferir propriedade? → into_iter()
Para streaming, isso é fundamental.
8. Streaming de bytes: Read
Quando o dado não vem “linha por linha”, mas como bytes, Rust usa traits de I/O.
[Link] 8/25
11/03/2026, 12:49 Python vs Rust Streaming
Exemplo: ler em blocos
Rust
use std::fs::File;
use std::io::{self, Read};
fn main() -> io::Result<()> {
let mut file = File::open("[Link]")?;
let mut buffer = [0u8; 1024];
loop {
let n = [Link](&mut buffer)?;
if n == 0 {
break;
}
println!("Li {} bytes", n);
// processa &buffer[..n]
}
Ok(())
}
Correlação com Python
Python
Python Executar
with open("[Link]", "rb") as f:
while True:
chunk = [Link](1024)
if not chunk:
break
print(f"Li {len(chunk)} bytes")
Ponte mental
[Link](1024) ↔ [Link](&mut buffer)
chunk ↔ &buffer[..n]
A diferença é que em Rust você controla o buffer explicitamente.
Isso dá mais performance e menos alocação desnecessária.
9. Por que Rust é muito forte em streaming
[Link] 9/25
11/03/2026, 12:49 Python vs Rust Streaming
Rust brilha em streaming porque junta:
alta performance
controle de memória
zero-cost abstractions
segurança contra data races
concorrência segura
processamento incremental sem garbage collector
Em Python
Você consegue fazer streaming muito bem, mas em cenários pesados pode sofrer com:
GIL
overhead de objetos
mais alocações
menor previsibilidade de latência
Em Rust
Você ganha:
uso de memória mais previsível
mais throughput
ótimo comportamento para sistemas embarcados, rede, telemetria, logs, parsers e
backpressure
10. Streaming assíncrono em Rust
Agora entramos no ponto mais moderno.
Quando os dados chegam da rede, socket, fila ou API, o modelo costuma ser assíncrono.
Em Python
Você talvez já tenha visto:
Python Executar
import asyncio
async def main():
await [Link](1)
print("ok")
[Link] 10/25
11/03/2026, 12:49 Python vs Rust Streaming
[Link](main())
Ou streams com async for .
Em Rust
Você normalmente usa Tokio.
[Link]
TOML
[dependencies]
tokio = { version = "1", features = ["full"] }
tokio-stream = "0.1"
futures = "0.3"
Exemplo simples com canal assíncrono
Rust
use tokio::sync::mpsc;
use tokio_stream::{wrappers::ReceiverStream, StreamExt};
#[tokio::main]
async fn main() {
let (tx, rx) = mpsc::channel(10);
tokio::spawn(async move {
for i in 0..5 {
[Link](i).[Link]();
}
});
let mut stream = ReceiverStream::new(rx);
while let Some(item) = [Link]().await {
println!("Recebido: {}", item);
}
}
11. Comparando com Python async
[Link] 11/25
11/03/2026, 12:49 Python vs Rust Streaming
Python
Python Executar
import asyncio
async def producer(queue):
for i in range(5):
await [Link](i)
async def consumer(queue):
while True:
item = await [Link]()
print("Recebido:", item)
queue.task_done()
async def main():
queue = [Link]()
asyncio.create_task(producer(queue))
asyncio.create_task(consumer(queue))
await [Link](1)
[Link](main())
Rust equivalente mental
[Link]() ↔ tokio::sync::mpsc::channel(...)
await [Link](i) ↔ [Link](i).await
item = await [Link]() ↔ [Link]().await
12. A diferença entre Iterator e Stream
Esse ponto costuma confundir quem vem de Python.
Iterator
É síncrono.
Você chama:
next()
E recebe:
Some(item) ou None
[Link] 12/25
11/03/2026, 12:49 Python vs Rust Streaming
Stream
É assíncrono.
Você chama:
next().await
E recebe:
Some(item) ou None
Resumo mental
Python
for x in algo: → síncrono
async for x in algo: → assíncrono
Rust
Iterator → síncrono
Stream → assíncrono
Excelente correlação.
13. Exemplo real de pipeline de streaming
Vamos imaginar um fluxo de logs chegando e sendo filtrados.
Rust assíncrono
Rust
use tokio::sync::mpsc;
use tokio_stream::{wrappers::ReceiverStream, StreamExt};
#[tokio::main]
async fn main() {
let (tx, rx) = mpsc::channel(100);
tokio::spawn(async move {
let logs = vec![
"INFO: sistema iniciado",
"ERROR: falha no banco",
"INFO: tentativa de reconexao",
"ERROR: timeout",
[Link] 13/25
11/03/2026, 12:49 Python vs Rust Streaming
];
for log in logs {
[Link](log.to_string()).[Link]();
}
});
let stream = ReceiverStream::new(rx);
let errors: Vec<String> = stream
.filter(|msg| [Link]("ERROR"))
.collect()
.await;
for err in errors {
println!("{}", err);
}
}
O que isso lembra em Python?
Python Executar
logs = [
"INFO: sistema iniciado",
"ERROR: falha no banco",
"INFO: tentativa de reconexao",
"ERROR: timeout",
]
errors = [msg for msg in logs if "ERROR" in msg]
for err in errors:
print(err)
Diferença prática
Em Rust, esse fluxo pode estar vindo da rede em tempo real, com backpressure e
concorrência segura.
14. Backpressure: conceito importantíssimo
Se você quer trabalhar com streaming de verdade, precisa entender isso.
O que é backpressure?
É quando o produtor gera dados mais rápido do que o consumidor consegue processar.
[Link] 14/25
11/03/2026, 12:49 Python vs Rust Streaming
Em Python
Às vezes isso explode memória ou lota fila se você não controlar bem.
Em Rust com canais limitados
Rust
let (tx, rx) = mpsc::channel(10);
Esse 10 é a capacidade do buffer.
Se lotar:
o send().await espera
isso desacelera o produtor
o sistema fica mais estável
Isso é excelente para:
telemetria
filas internas
leitura de sensores
pipelines ETL
sistemas de rede
processamento de eventos
15. Trait: a peça conceitual que em Python seria
“protocolo”
Em Rust, muita coisa do streaming gira em torno de traits.
Exemplos
Iterator
Read
BufRead
Write
Stream
Analogia com Python
Lembra um pouco:
[Link] 15/25
11/03/2026, 12:49 Python vs Rust Streaming
duck typing
protocolos
objetos que implementam certos métodos
Mas em Rust isso é:
explícito
verificado em compilação
otimizado
Exemplo:
Rust
fn processar_linhas<R: BufRead>(reader: R) {
for line in [Link]() {
println!("{:?}", line);
}
}
Leitura mental
“Essa função aceita qualquer coisa que implemente BufRead .”
Em Python, seria parecido com:
“qualquer objeto que se comporte como arquivo”.
16. Exemplo didático: construir seu próprio iterator
Isso ajuda muito a entender streaming em Rust.
Rust
struct Contador {
atual: u32,
max: u32,
}
impl Iterator for Contador {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
if [Link] < [Link] {
let valor = [Link];
[Link] += 1;
Some(valor)
} else {
[Link] 16/25
11/03/2026, 12:49 Python vs Rust Streaming
None
}
}
}
fn main() {
let contador = Contador { atual: 0, max: 5 };
for n in contador {
println!("{}", n);
}
}
Correlação com Python generator
Python Executar
def contador(maximo):
atual = 0
while atual < maximo:
yield atual
atual += 1
Diferença conceitual
Em Python, yield esconde a máquina de estados.
Em Rust, você pode modelar isso explicitamente via Iterator .
17. Quando usar cada abordagem em Rust
Iterator
Use quando:
os dados já estão locais
processamento é síncrono
leitura é simples e bloqueante
pipeline é CPU-bound pequeno ou médio
Exemplos:
arquivos
vetores
parsing local
transformação em lote
[Link] 17/25
11/03/2026, 12:49 Python vs Rust Streaming
Read / BufRead
Use quando:
está lendo bytes ou linhas
quer eficiência de I/O
quer processar sem carregar tudo na memória
Exemplos:
arquivos grandes
stdin
pipes
logs
Stream + Tokio
Use quando:
os dados chegam ao longo do tempo
há concorrência
rede, sockets, canais, filas
quer arquitetura reativa
Exemplos:
websocket
TCP
filas de eventos
telemetria
microserviços
IoT
18. Exemplo mental para IoT e sistemas embarcados
Como você gosta de IoT, essa correlação vai te ajudar muito.
Imagine um ESP32 ou gateway recebendo dados de sensores.
Em Python
Você poderia ter algo assim:
[Link] 18/25
11/03/2026, 12:49 Python vs Rust Streaming
Python Executar
def ler_sensor():
while True:
valor = obter_amostra()
yield valor
Em Rust
Você pode modelar como:
iterator, se for síncrono
stream/canal, se houver tarefas concorrentes
leitura em buffer, se vier por serial/UART/TCP
Conceitualmente
sensor produz dado
canal transmite
consumidor processa
buffer limita pressão
ownership garante segurança
Esse modelo é excelente para sistemas embarcados e edge computing.
19. Erros em streaming: Python vs Rust
Python
Você muitas vezes trata erro em runtime:
Python Executar
try:
with open("[Link]") as f:
...
except Exception as e:
print(e)
Rust
Erros aparecem de forma explícita:
Rust
[Link] 19/25
11/03/2026, 12:49 Python vs Rust Streaming
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let file = File::open("[Link]")?;
let reader = BufReader::new(file);
for line in [Link]() {
let line = line?;
println!("{}", line);
}
Ok(())
}
Vantagem
No streaming, isso reduz muito bug silencioso.
20. Modelo mental definitivo para você
Guarde isso:
Python
Streaming =
iterables + generators + async for + queues
Rust
Streaming =
Iterator + Read/BufRead + Stream + channels + ownership
21. Tabela de correlação rápida
Conceito Python Rust
Iteração simples for x in xs for x in xs
Geração lazy yield , generator expression Iterator
Ler arquivo em fluxo for linha in f BufReader::lines()
Ler bytes por bloco [Link](1024) read(&mut buffer)
[Link] 20/25
11/03/2026, 12:49 Python vs Rust Streaming
Conceito Python Rust
Fila assíncrona [Link] tokio::sync::mpsc
Loop assíncrono async for StreamExt::next().await
Tipagem de capacidade duck typing/protocols traits
Memória dinâmica/GC ownership/borrowing
22. O que mais confunde quem vem do Python
1. String vs &str
Em streaming textual isso aparece toda hora.
String = dono do texto
&str = referência para texto
Python não separa isso.
2. Consumo de valores
Você itera e perde a coleção se usar into_iter() .
Python quase nunca força esse raciocínio.
3. Option e Result
Rust deixa explícito quando:
pode não haver próximo item
pode haver erro
Isso deixa o streaming muito mais robusto.
4. Async em Rust é mais explícito
Você precisa runtime, crates, traits auxiliares.
Em troca, ganha muito controle e performance.
[Link] 21/25
11/03/2026, 12:49 Python vs Rust Streaming
23. Estratégia prática para aprender rápido vindo de
Python
Minha recomendação direta:
Etapa 1
Aprenda muito bem:
Vec
String e &str
iter() , iter_mut() , into_iter()
map , filter , collect
Etapa 2
Aprenda I/O:
File
Read
BufRead
BufReader
Etapa 3
Aprenda concorrência:
threads
mpsc
ownership entre tarefas
Etapa 4
Aprenda async:
tokio
async fn
await
StreamExt
Essa sequência é a melhor para não embolar.
[Link] 22/25
11/03/2026, 12:49 Python vs Rust Streaming
24. Exemplo completo e didático: arquivo grande filtrando
linhas
Rust
Rust
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn main() -> io::Result<()> {
let file = File::open("[Link]")?;
let reader = BufReader::new(file);
let erros: Vec<String> = reader
.lines()
.filter_map(|line| match line {
Ok(texto) if [Link]("ERROR") => Some(texto),
_ => None,
})
.collect();
for erro in erros {
println!("{}", erro);
}
Ok(())
}
Explicando passo a passo
[Link]()
Transforma o leitor em stream síncrono de linhas.
filter_map(...)
Filtra e transforma ao mesmo tempo.
Ok(texto) if [Link]("ERROR")
Só passa linhas válidas que contêm "ERROR" .
collect()
Materializa o resultado em Vec<String> .
[Link] 23/25
11/03/2026, 12:49 Python vs Rust Streaming
Python equivalente
Python Executar
with open("[Link]", "r", encoding="utf-8") as f:
erros = [[Link]() for linha in f if "ERROR" in linha]
for erro in erros:
print(erro)
25. Onde Rust supera brutalmente Python em streaming
Rust tende a ser muito forte em:
parser de arquivos grandes
processamento contínuo de logs
gateways IoT
proxies e serviços TCP/UDP
telemetria em tempo real
pipelines de alta taxa
software embarcado
sistemas com restrição de memória
processamento paralelo previsível
Python continua ótimo para:
prototipação
ETL simples
scripts rápidos
integração
análise exploratória
A decisão prática costuma ser:
Python para provar a ideia rápido
Rust para colocar o pipeline crítico para rodar com eficiência
26. Resumo final em linguagem simples
Pense assim:
Python faz streaming de maneira mais leve e produtiva.
Rust faz streaming com mais rigor, mais segurança e mais performance.
[Link] 24/25
11/03/2026, 12:49 Python vs Rust Streaming
A ponte mental principal é:
generator em Python ↔ Iterator em Rust
async for em Python ↔ Stream em Rust
[Link] ↔ tokio::mpsc
arquivo iterável ↔ BufReader::lines()
[Link](chunk) ↔ Read::read(&mut buffer)
E o grande diferencial do Rust é:
ownership
borrowing
controle explícito
segurança em compilação
27. Próximo passo ideal
Para aprender isso de verdade, o melhor exercício é construir nesta ordem:
1. leitor de arquivo linha por linha
2. filtro de logs com Iterator
3. leitura de bytes em chunks
4. producer/consumer com mpsc
5. stream assíncrono com Tokio
Eu posso te entregar agora uma trilha prática com 5 exemplos progressivos em Rust,
comparando com Python, começando do básico até um mini pipeline de streaming em
tempo real.
[Link] 25/25