fibras
Demo de Concurrencia en Pokémon
Este proyecto es una demostración comparativa de diferentes enfoques de concurrencia para realizar solicitudes HTTP concurrentes. Está diseñado para audiencias expertas en desarrollo de software que desean entender las diferencias de rendimiento entre varios lenguajes y modelos de concurrencia.
Descripción
El proyecto obtiene datos de 15 Pokémon de la PokeAPI_ de manera concurrente usando diferentes lenguajes de programación y técnicas de concurrencia. Cada implementación realiza las mismas 15 solicitudes HTTP y mide el tiempo total de ejecución.
.. _PokeAPI: https://pokeapi.co/
Implementaciones
🐘 PHP (Síncrono) Implementación base síncrona usando file_get_contents()
. Sirve como línea base para comparar el rendimiento.
🐘 PHP (Fibers) Usa las fibers de PHP 8.1+ con un programador de eventos personalizado basado en stream_select()
para manejar I/O asíncrona.
💎 Crystal (Fibers) Utiliza las fibers integradas de Crystal con canales para comunicación entre hilos ligeros.
🐹 Go (Goroutines) Emplea goroutines nativas de Go con sync.WaitGroup para sincronización.
🦀 Rust (Async/Await) Implementa async/await con el runtime Tokio para tareas asíncronas.
Requisitos
- PHP 8.1+ con extensión fibers
- Crystal_
- Go_
- Rust_ con Cargo
- Conexión a internet (para acceder a PokeAPI)
.. _Crystal: https://crystal-lang.org/ .. _Go: https://golang.org/ .. _Rust: https://www.rust-lang.org/
Ejecución
Compilar y ejecutar el benchmark completo::
make
Esto compilará todos los lenguajes compilados (Crystal, Go, Rust) y ejecutará el benchmark mostrando una tabla comparativa de tiempos.
Para limpiar los artefactos de compilación::
make clean
Ejecución Individual
PHP Síncrono::
php php/sync-fetch_pokemon.php
PHP Fibers::
php php/fibers-fetch_pokemon.php
Crystal::
./crystal/fibers-fetch_pokemon
Go::
./go/fetch_pokemon
Rust::
./rust/target/release/fetch_pokemon
Cada programa acepta el argumento quiet
para suprimir la salida por Pokémon::
php php/sync-fetch_pokemon.php quiet
Resultados Típicos
En una ejecución típica, los resultados muestran diferencias significativas de rendimiento entre los modelos de concurrencia:
- PHP Síncrono: ~8000-9000 ms (línea base)
- PHP Fibers: ~5000-6000 ms (mejora moderada)
- Crystal Fibers: ~400-500 ms (alto rendimiento)
- Go Goroutines: ~200-400 ms (muy rápido)
- Rust Async/Await: ~500-700 ms (buen rendimiento)
Los resultados pueden variar según la conexión a internet y la carga del sistema.
Arquitectura
Cada implementación sigue el mismo patrón:
#. Iniciar temporización #. Lanzar 15 tareas concurrentes para obtener Pokémon #1 al #15 #. Esperar que todas las tareas se completen #. Calcular y mostrar el tiempo total
Los programas usan el modo "quiet" durante el benchmark para evitar interferencia de I/O en las mediciones.
Contribución
Este proyecto está diseñado como demostración educativa. Las contribuciones son bienvenidas, especialmente para agregar más lenguajes o mejorar las implementaciones existentes.
Licencia
Este proyecto es de dominio público. Úsalo como quieras para aprender sobre concurrencia en diferentes lenguajes de programación.
fibras
- 0
- 0
- 0
- 0
- 0
- 6 days ago
- September 23, 2025
Sun, 28 Sep 2025 18:04:55 GMT