Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

424
Vistas
¿Cómo evito interbloqueos y errores silenciosos cuando uso select?

Estoy aprendiendo Ir con el ejemplo . Acabo de implementar una selección para esperar múltiples canales de la siguiente manera:

 for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } }

Con un poco de experimentación, descubrí que puedo introducir ingenuamente errores de tiempo de ejecución de la siguiente manera:

  • Si reduzco i a 1, se recibe el primer mensaje, pero el segundo se pierde silenciosamente (no hay indicios de que lo haya ignorado sin darme cuenta).

  • Si aumento i a 3, se reciben ambos mensajes, pero fatal error: all goroutines are asleep - deadlock!

Leyendo y buscando ese mensaje de error en StackOverflow , puedo ver que WaitGroups cuenta para este tipo de problemas. Pero no parecen aplicarse a select , por lo que siento que me falta algo.

¿Existe una construcción de lenguaje (como if/then/else ) o un patrón de software que pueda usar para prevenir o mitigar estos errores en el código del mundo real?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Conceptualmente, usted mitiga esto diseñando el software correctamente. Si tiene dos canales y cada canal recibirá como máximo un mensaje, no intente leerlos 3 veces. Esto no es diferente a tratar de poner tres elementos en una matriz de dos elementos, o tratar de dividir dos números donde el divisor es 0. En todos estos casos, los lenguajes ofrecen formas de descubrir y recuperarse del error, pero si en realidad estás produciendo estos errores, indica una falla de lógica o de diseño.

Debe asegurarse de que sus canales tengan una cantidad equilibrada de lecturas y escrituras, y que el extremo emisor cierre el canal cuando no tenga nada más que enviar para que los receptores puedan dejar de esperar mensajes que no llegarán. De lo contrario, eventualmente tendrá algo atascado esperando, o mensajes en un búfer que se ignoran.

En este caso muy específico, si desea leer de ambos canales pero solo si un mensaje está listo, puede agregar un caso default que se invocará si ningún canal está listo para leer, pero eso es para situaciones en las que sus canales no están listos. todavía , pero eventualmente estará listo. Proporcionar un default no es una buena solución para cubrir los errores en los que los canales nunca estarán listos y todavía está tratando de leerlos; eso indica una falla de nivel lógico que debe corregirse.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda