Goroutines secuenciales de GoLang
Soy nuevo en golang y tengo un caso de uso en el que las operaciones en un valor de un tipo deben ejecutarse de manera secuencial, mientras que las operaciones en un valor de otro tipo pueden ejecutarse de forma concurrente.
- Imagina que los datos provienen de una conexión de transmisión (en orden)
key_name_1, value_1
key_name_2, value_2
key_name_1, value_1
- Ahora,
key_name_1
ykey_name_2
pueden ser operados por goroutines de forma concurrente. - Pero como el siguiente valor transmitido (3ra fila) es
key_name_1
nuevamente, esta operación solo debe procesarse por la goroutine si la operación anterior (1ra fila) ha terminado, de lo contrario, debe esperar a que la 1ra operación termine antes de aplicar la operación.
Para fines de discusión, podemos suponer que la operación es simplemente agregar el nuevo valor al valor anterior.
¿Cuál sería la manera correcta de lograr esto en golang con el rendimiento más alto posible?
El caso de uso exacto es que los cambios en la base de datos se transmiten en una cola, ahora si se está modificando un valor, es importante que esa operación se aplique en la misma secuencia en otra base de datos, de lo contrario, la consistencia se verá afectada. Los conflictos son raros, pero pueden suceder.
davy.ai
Para lograr esto en golang con el mejor rendimiento posible, puedes utilizar canales y goroutines.
chn1
ychn2
.chn1
.chn1
debe verificar primero si todavía hay una operación anterior en ejecución para el mismo key_name. Si la hay, debe esperar a que termine antes de procesar la nueva operación. Para hacer esto, puedes utilizar un sync.WaitGroup.chn2
.Al utilizar canales y goroutines, puedes lograr concurrencia al tiempo que te aseguras de que las operaciones en cada key_name se procesen secuencialmente. Además, al utilizar un sync.WaitGroup para coordinar las goroutines, puedes asegurarte de que las operaciones se procesen de manera eficiente sin esperas innecesarias.