Prácticas recomendadas para los fundamentos de concurrencia
Comparta memoria comunicándose, y cuándo usar bloqueos.
Busca en todas las páginas de la documentación
Comparta memoria comunicándose, y cuándo usar bloqueos.
Estas reglas mantienen las goroutines acotadas, los canales libres de deadlocks y el estado compartido libre de condiciones de carrera, desde los portátiles de desarrollo hasta los servicios de producción.
go, canales o tipos sync.go test -race ./... y golangci-lint en los paquetes modificados antes de fusionar.go necesita una vía de finalización: WaitGroup, close(ch) o cancelación de context.main retorne mientras los workers siguen ejecutándose. La salida mata el proceso sin esperar a las goroutines en segundo plano.runtime.NumGoroutine() en las pruebas de resistencia. El crecimiento monotónico indica fugas en recepciones de canales bloqueadas.range o v, ok := <-ch.sync.Once o una goroutine coordinadora dedicada.select + default. Los sondeos activos consumen CPU; bloquee o use temporizadores/plazos de contexto.context.WithTimeout sobre time.After en bucles de servidor. Reutilice temporizadores en rutas críticas para reducir las asignaciones.defer mu.Unlock() inmediatamente después de Lock. Sobrevive a pánicos y retornos tempranos en los manejadores.go test -race en CI para paquetes que usan concurrencia. Trate los nuevos informes de condiciones de carrera como bloqueadores de lanzamiento.-count=50 -race. Las intercalaciones exponen condiciones de carrera que pasan una vez.-race a producción sensible a la latencia. Use pruebas de resistencia en staging con compilaciones de condiciones de carrera en su lugar.context.Context a través de árboles de llamadas concurrentes. La cancelación detiene las goroutines descendentes cuando los clientes se desconectan.Canales al transferir propiedad o preparar trabajo de tubería.
Mutex cuando una struct compartida pequeña ve actualizaciones frecuentes.
Comience en 0 o el número de workers.
Aumente solo cuando los perfiles muestren bloqueos en búferes llenos.
Vincule el trabajo en segundo plano a r.Context().
Retorne cuando el cliente se desconecte y los workers observen ctx.Done().
No, primero compare el benchmark de Mutex+map.
Use sync.Map solo para cachés probadas de solo lectura.
net/http ya lo hace por solicitud.
Las goroutines adicionales necesitan justificación y cancelación.
Cuando un escritor es dueño de la mutación o un mutex serializa el acceso.
Comuníquese primero; comparta cuando sea más simple y medido.
Verifique la propiedad del cierre, el emparejamiento de WaitGroup, el alcance del bloqueo y si existen pruebas -race.
No, solo acceso a memoria no sincronizado.
Agregue tiempos de espera y pruebas de cierre estructuradas por separado.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (Green Tea GC por defecto, go fix modernizers - verifique el parche en la compilación), chi (última - verifique en la compilación), gin (última - verifique en la compilación), echo (última - verifique en la compilación), google.golang.org/grpc (última - verifique en la compilación), sigs.k8s.io/controller-runtime (última - verifique en la compilación), kubebuilder (última - verifique en la compilación), tinygo (última - verifique los objetivos de la placa en la compilación), wazero (última - verifique en la compilación) y golangci-lint (última - verifique el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026