|
| 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) |
0 commit comments