Durante el desarrollo de LiveApi, una herramienta de generación de documentación de AUTO API, necesitaba implementar un mecanismo de cola robusto que se escalara en función de la cantidad de núcleos de máquina del servidor. Esto fue crucial para evitar el uso excesivo de recursos (memoria y CPU) que podría conducir a la inanición de recursos, bloqueos y una mala experiencia del usuario.
En este artículo, explicaré cómo utilicé mutexes en Golang para abordar este desafío.
¿Qué es un mutex?
En la programación concurrente, un mutex (exclusión mutua) es un mecanismo de bloqueo que evita las condiciones de la carrera al garantizar que solo una goldine pueda acceder a un recurso compartido a la vez. Es similar a una clave para una habitación: solo una persona puede contener la llave e ingresar de inmediato.
mutex use en golang
Ilustremos cómo un mutex puede administrar la ejecución de trabajo concurrente:
El paquete de sincronización de GO proporciona varias primitivas para la sincronización, siendo Mutex una de las herramientas más utilizadas.
var ( maxConcurrentJobs int activeJobs int jobMutex sync.Mutex )
En este código, la variable ActiveJobs rastrea el número de trabajos en ejecución actualmente. Dado que múltiples goroutinas podrían intentar modificar esta variable simultáneamente, lo que lleva a condiciones de carrera, usamos un mutex para sincronizar el acceso.
// Check if we can process more jobs jobMutex.Lock() if activeJobs >= maxConcurrentJobs { jobMutex.Unlock() // Wait before checking again time.Sleep(time.Second) continue } jobMutex.Unlock()
cómo funciona un mutex
bloqueo : el método Lock () adquiere acceso exclusivo a la sección crítica.
desbloqueo : el método desbloqueo () libera el bloqueo.
Sección crítica : el código entre bloquear y desbloquear donde se accede al recurso compartido **
tipos de mutexes en golang
sync.mutex : este es el bloqueo de exclusión mutua básica en Go. Permite que solo una goroutina acceda a la sección crítica a la vez.
type SafeCounter struct { mu sync.Mutex count int }
sync.rwmutex : este es un lector/escritor mutex que permite a múltiples lectores acceder al recurso compartido simultáneamente, pero solo un escritor a la vez.
var rwMutex sync.RWMutex // Reader methods rwMutex.RLock() // Lock for reading rwMutex.RUnlock() // Unlock for reading // Writer methods rwMutex.Lock() // Lock for writing rwMutex.Unlock() // Unlock for writing
Los mutexes son herramientas esenciales para administrar recursos compartidos en programas de GO concurrentes. Prevengan las condiciones de la carrera y garantizan la integridad de los datos controlando el acceso a secciones críticas del código.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3