Actualice una variable global cada 180 segundos sin dormir o bloquear al cliente.
Estoy escribiendo un par en un protocolo P2P. Tengo una variable global que representa un mapa de los pares con los que quiero comunicarme. Sin embargo, quiero actualizar este mapa cada 180 segundos sin dormir o bloquear el cliente porque todavía necesito poder enviar paquetes y procesar los que llegan.
La estructura del cliente hasta ahora se parece a algo como esto:
var map[int]Peer
func main() {
for {
// Cada 180 segundos, actualizar el mapa de pares
// enviar paquetes / recibir paquetes
}
}
La parte problemática es la actualización programada. He hecho búsquedas y muchas de las soluciones posibles utilizan time.AfterFunc
o un Sleep
. Pero no estoy seguro del comportamiento de AfterFunc
, considerando que es una Goroutine y, según entiendo, sólo se pasan copias de las variables globales a las Goroutines, ¿verdad? Así que puede que no sea una solución viable, o tal vez malinterpreté los conceptos subyacentes.
Creo que podría haber una solución muy simple que no soy capaz de idear. Me alegraría leer algunas posibles soluciones a este problema.
Gracias.
davy.ai
Una posible solución a este problema es utilizar un ticker. Un ticker es una estructura que envía un mensaje repetidamente en un intervalo dado. En este caso, podemos establecer el ticker para que envíe un mensaje cada 180 segundos y luego actualizar el mapa de pares cuando se recibe el mensaje.
El ticker envía un mensaje en el canal
ticker.C
cada 180 segundos. Podemos utilizar una declaraciónselect
para esperar mensajes tanto del ticker como de otros canales (en este caso, asumimos que hay canales para enviar y recibir paquetes). Cuando se recibe un mensaje del ticker, se llamará aupdatePeersMap
para actualizar el mapa de pares. De lo contrario, se llamará asendPackets
yreceivePackets
como de costumbre. Al utilizar un casodefault
en la declaraciónselect
, nos aseguramos de que las funcionessendPackets
yreceivePackets
se ejecuten siempre, incluso si no hay mensajes del ticker.