concurrency synchronization go goroutine

concurrency - ¿Es seguro que más de una goroutina imprima en stdout?



synchronization goroutine (3)

Tengo múltiples goroutines en mi programa, cada uno de los cuales realiza llamadas a fmt.Println sin ninguna sincronización explícita. ¿Es seguro (es decir, aparecerá cada línea por separado sin dañar los datos), o debo crear otra goroutine con sincronización específicamente para manejar la impresión?


Los métodos comunes (fmt.printLine) no son seguros. Sin embargo, hay métodos que son.

log.Logger es "goroutine safe": https://golang.org/pkg/log/#Logger

Algo como esto creará un registrador stdout que puede usarse desde cualquier rutina de forma segura.

logger := log.New(os.Stdout, "", 0)


No, no es seguro, aunque a veces no se observen problemas. IIRC, el paquete fmt intenta estar en el lado seguro, por lo que probablemente se produzca algún tipo de mezcla, pero es probable que no se produzca un fallo en el proceso.

Esta es una instancia de una regla de documentación de Go más universal: las cosas no son seguras para el acceso simultáneo a menos que se especifique lo contrario o sea obvio desde el contexto.

Uno puede tener una versión segura de un buen subconjunto de la funcionalidad fmt.Print * utilizando el paquete de registro con una pequeña configuración inicial.


Todo lo que fmt hace vuelve a w.Write() como se puede ver here . Debido a que no hay bloqueo alrededor, todo vuelve a la implementación de Write() . Como todavía no hay bloqueo ( al menos para Stdout ), no hay garantía de que su salida no se mezcle.

Recomiendo usar una rutina de registro global.

Además, si simplemente desea registrar datos, use el paquete de log , que bloquea el acceso a la salida correctamente. Ver la implementation para referencia.