Cuenta la frecuencia de las letras en textos mediante computación en paralelo.
El paralelismo consiste en hacer en paralelo cosas que también se pueden hacer de forma secuencial. Un ejemplo habitual es contar la frecuencia de letras. Utiliza el paralelismo para calcular la frecuencia total de cada letra en una lista de textos.
Go admite la concurrencia mediante «goroutines», que se inician con la palabra clave go.
Es una forma sencilla, ligera y elegante de proporcionar soporte para la concurrencia, y una de las mayores fortalezas del lenguaje.
Es posible que hayas notado que, aunque este ejercicio se llama frecuencia de letras en paralelo, el término «paralelo» no se usa muy a menudo en Go. Los Gophers prefieren usar el término concurrente para describir la gestión de varias goroutines independientes (los «procesos» o «hilos» en el contexto de otros lenguajes). Aunque estos términos suelen usarse indistintamente, a los Gophers les gusta ser técnicamente precisos y usan «concurrente» cuando hablan de las ejecuciones aparentemente simultáneas de las goroutines.
Aunque podemos planificar que nuestros programas se ejecuten en paralelo y, por momentos, puede parecer que lo hacen, sin un conocimiento estricto del contexto de ejecución de nuestro código lo único que podemos garantizar es que los procesos se ejecutarán de forma concurrente. En otras palabras, puede que se estén ejecutando de forma secuencial más rápido de lo que somos capaces de distinguir, pero no estrictamente de forma simultánea.
Para saber más, echa un vistazo a la entrada de The Go Blog: Concurrency is not parallelism.
Si es la primera vez que trabajas con las funcionalidades de concurrencia de Go, aquí tienes algunos recursos para empezar. Te recomendamos que les eches un vistazo antes de empezar este ejercicio:
Si quieres profundizar de verdad, puedes probar el libro Concurrency in Go de @kat-co.
En este ejercicio, las pruebas unitarias no pueden determinar si has escrito una buena solución concurrente.
En su lugar, lo mejor es resolver este ejercicio en local y ejecutar los benchmarks con go test -bench ..
Si la solución es buena, deberías ver que la versión concurrente muestra un número menor de nanosegundos por operación (ns/op) que la versión secuencial.
Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.
Exploramos las diferencias entre concurrencia y paralelismo, viendo los distintos enfoques que adoptan lenguajes como JavaScript, Go, Elixir y Rust.