En el ejemplo anterior utilizamos bloqueo explícito con mutex para sincronizar el acceso al estado compartido a través de múltiples goroutines. Otra opción es usar las características de sincronización incorporadas de las goroutines y canales para lograr el mismo resultado. Este enfoque basado en canales se alinea con las ideas de Go de compartir memoria mediante comunicación y tener cada pieza de datos propiedad de exactamente 1 goroutine. |
|
|
|
|
|
En este ejemplo, nuestro estado será propiedad de una única
goroutine. Esto garantizará que los datos nunca se
corrompan con acceso concurrente. Para leer o
escribir ese estado, otras goroutines enviarán mensajes
a la goroutine propietaria y recibirán las respuestas
correspondientes. Estos |
|
|
|
Como antes, contaremos cuántas operaciones realizamos. |
|
Los canales |
|
Aquí está la goroutine que posee el |
|
Esto inicia 100 goroutines para emitir lecturas a la
goroutine propietaria del estado a través del canal |
|
Iniciamos también 10 escrituras, utilizando un enfoque similar. |
|
Dejamos que las goroutines trabajen durante un segundo. |
|
Finalmente, capturamos e informamos los conteos de operaciones. |
|
Al ejecutar nuestro programa se muestra que el ejemplo de gestión de estado basado en goroutines completa alrededor de 80,000 operaciones en total. |
|
Para este caso particular, el enfoque basado en goroutines fue un poco más complicado que el basado en mutex. Sin embargo, podría ser útil en ciertos casos, por ejemplo, cuando se tienen otros canales involucrados o cuando la gestión de múltiples mutex sería propensa a errores. Debes usar el enfoque que te parezca más natural, especialmente en cuanto a la comprensión de la corrección de tu programa. |
Siguiente ejemplo: Sorting.