Patrón de bloqueo en búfer en Go
En Go, un canal en búfer permite que la comunicación continúe sin bloquearse hasta que se llene su búfer. Sin embargo, ¿existe un patrón similar para los bloqueos de almacenamiento en búfer que limitan el acceso a los recursos a un número específico de clientes?
La primitiva para administrar el acceso simultáneo a un recurso es el semáforo. Un semáforo se puede implementar fácilmente usando un canal almacenado en búfer.
Aquí hay un ejemplo:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks if 4 other concurrent invocations of f are running. semaphoreEn este ejemplo, se crea un semáforo con un búfer de tamaño 4 usando semáforo := make(chan struct{}, 4). La función f() intenta adquirir el bloqueo enviando una estructura vacía al canal. Si el búfer del canal está lleno (es decir, ya se están ejecutando 4 instancias simultáneas de f()), la llamada al semáforo
Cuando la función finaliza su tarea, libera el bloqueo recuperando una estructura vacía del canal (-
Este patrón proporciona una manera conveniente de restringir el acceso a un recurso compartido a un número específico de clientes simultáneos, evitando posibles problemas de contención de recursos.
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