Skip to content

Commit c7a72d5

Browse files
authored
async patterns post (#8)
1 parent b891a92 commit c7a72d5

4 files changed

Lines changed: 112 additions & 0 deletions

File tree

assets/slides/async-patterns.pdf

833 KB
Binary file not shown.
-5.74 MB
Binary file not shown.
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
+++
2+
date = '2025-11-27T20:00:00-03:00'
3+
draft = false
4+
hiddenFromHomePage = false
5+
title = 'Async Rust: Compartiendo Memoria'
6+
description = 'Cómo manejar memoria compartida en Async Rust, comparando distintos enfoques y resaltando la importancia de elegir el modelo adecuado según las necesidades de concurrencia y paralelismo'
7+
tags = ["rust", "async", "await", "concurrencia", "runtimes", "presentacion", "video"]
8+
categories = ["Proyectos", "Eventos"]
9+
+++
10+
11+
# Async Rust: Compartiendo Memoria
12+
13+
El pasado 27 de noviembre de 2025, Gabriel Steinberg presentó una charla titulada *Async Rust: compartiendo memoria*, donde exploró distintos métodos para manejar estado mutable compartido en aplicaciones asincrónicas en Rust.
14+
15+
16+
## Presentación
17+
18+
En esta presentación Gabriel Steinberg explica cómo manejar memoria compartida en Async Rust, comparando distintos enfoques y resaltando la importancia de elegir el modelo adecuado según las necesidades de concurrencia y paralelismo.
19+
20+
{{< youtube FEBSepG0Lr4 >}}
21+
22+
---
23+
24+
## Descargar las slides
25+
26+
[**📋 Descargar slides de la presentación (PDF)**](/slides/async-patterns.pdf)
27+
28+
Las slides incluyen:
29+
- Ejemplos de servidores TCP en Rust.
30+
- Problemas comunes con el borrow checker en contextos async.
31+
- Uso de `Mutex`, `Arc`, y canales para sincronización.
32+
- Modelos alternativos de concurrencia y paralelismo.
33+
34+
---
35+
36+
## De implementación ingenua a sincronización
37+
38+
Al intentar implementar un servidor TCP asincrónico con Tokio, surge rápidamente un problema: el borrow mutable de `self` escapa del ciclo de aceptación de conexiones. Esto ocurre porque `tokio::spawn` requiere futuros `'static`, lo que rompe las reglas del borrow checker.
39+
40+
**Conclusión inicial:** necesitamos mecanismos de sincronización para compartir estado mutable.
41+
42+
### Mutex
43+
44+
Una primera solución es usar `tokio::sync::Mutex`. Esto permite mantener un `HashMap` de conexiones y bloquearlo mientras se realizan operaciones `await`. Sin embargo, este enfoque puede llevar a problemas de rendimiento.
45+
46+
### Canales
47+
48+
Una alternativa más robusta es usar **canales (`mpsc`)** para comunicar tareas. En este modelo:
49+
- Cada conexión se maneja con un `OwnedWriteHalf`.
50+
- Los mensajes se envían a un *dispatcher central* que decide cómo distribuirlos.
51+
- Se pueden agregar mecanismos de backpressure y manejo de errores.
52+
53+
Este enfoque evita bloqueos y permite mayor control sobre el flujo de mensajes. Pero tiene como tradeoff la complejidad de manejar cada interacción entre tareas, es dificil de debuggear, y el manejo de errores se torna poco natural.
54+
55+
### Un solo task
56+
57+
Finalmente, se mostró un modelo simplificado: manejar todas las conexiones en un **único task** que corre una carrera de futuros (`race`). Este diseño sacrifica paralelismo pero ofrece:
58+
- Acceso directo y seguro a estado mutable.
59+
- Flujo natural de errores.
60+
- Facilidad para trazar el origen de valores.
61+
62+
---
63+
64+
## Conclusiones
65+
66+
- **Trade-offs:** Mutex vs Canales vs Race/Select.
67+
- **Evaluar paralelismo:** no siempre es necesario, y puede complicar el diseño.
68+
- **Canales:** recomendados cuando se necesita paralelismo.
69+
- **Mutex:** útil en casos muy específicos.
70+
71+
---
72+
73+
## Referencias
74+
75+
- [Comparing patterns for mutable state in concurrent applications (post en el que se basa la charla)](https://taping-memory.dev/concurrency-patterns/)
76+
- [Let futures be futures](https://without.boats/blog/let-futures-be-futures/)
77+
- [Tree-Structured Concurrency](https://blog.yoshuawuyts.com/tree-structured-concurrency/)
78+
- [Tree-Structured Concurrency II: Replacing Background Tasks With Actors](https://blog.yoshuawuyts.com/replacing-tasks-with-actors/)
79+
- [sans-IO: The secret to effective Rust for network services](https://www.firezone.dev/blog/sans-io)
80+
81+
---
82+
83+
## Comunidad
84+
85+
La comunidad de Rust es uno de los pilares del lenguaje. Hay múltiples espacios de participación, tanto virtuales como presenciales:
86+
87+
### Conferencias
88+
89+
- [RustWeek](https://rustweek.org/)
90+
- [RustConf](https://rustconf.com/)
91+
- [EuroRust](https://eurorust.eu/)
92+
- [RustNation UK](https://www.rustnationuk.com/)
93+
94+
### Comunidad Online
95+
96+
- [Rust en español - Telegram](https://t.me/rust_lang_es)
97+
- [Foro oficial](https://users.rust-lang.org/)
98+
- [Subreddit r/rust](https://www.reddit.com/r/rust/)
99+
- [Canal de soporte en Zulip](https://rust-lang.zulipchat.com/)
100+
- [Discord de la comunidad](https://discord.gg/rust-lang-community)

content/posts/contributors.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ date: 2025-11-27
55

66
Desarrolladores que han colaborado con artículos y presentaciones en Oxidar:
77

8+
<div style="display:flex; align-items:center; margin-bottom:20px;">
9+
<img src="https://github.com/conectado.png" alt="Avatar Gabriel Steinberg" width="80" style="border-radius:50%; margin-right:15px;">
10+
<div>
11+
<strong>Gabriel Steinberg</strong><br>
12+
<a href="https://github.com/conectado">GitHub</a><br>
13+
<strong>Aportes:</strong>
14+
<ul>
15+
<li><a href="/async-patterns/">Async Rust: Compartiendo Memoria</a></li>
16+
</ul>
17+
</div>
18+
</div>
19+
820
<div style="display:flex; align-items:center; margin-bottom:20px;">
921
<img src="https://github.com/mrgonza78.png" alt="Avatar Alejandro Gonzalez" width="80" style="border-radius:50%; margin-right:15px;">
1022
<div>

0 commit comments

Comments
 (0)