es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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.

    var peersMap = make(map[int]Peer)
    
    func main() {
        // Crea un ticker que envía un mensaje cada 180 segundos
        ticker := time.NewTicker(180 * time.Second)
        defer ticker.Stop() // detén el ticker cuando finalice main
    
        for {
            select {
            // Cuando se recibe un mensaje del ticker, actualiza el mapa de pares
            case <-ticker.C:
                updatePeersMap()
    
            // De lo contrario, envía/recibe paquetes como siempre
            default:
                sendPackets()
                receivePackets()
            }
        }
    }
    
    func updatePeersMap() {
        // El código para actualizar el mapa de pares va aquí
    }
    

    El ticker envía un mensaje en el canal ticker.C cada 180 segundos. Podemos utilizar una declaración select 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á a updatePeersMap para actualizar el mapa de pares. De lo contrario, se llamará a sendPackets y receivePackets como de costumbre. Al utilizar un caso default en la declaración select, nos aseguramos de que las funciones sendPackets y receivePackets se ejecuten siempre, incluso si no hay mensajes del ticker.

Comments are closed.