Overview
El controlador Go utiliza el paquete de contexto de la librería estándar de Go para permitir que las aplicaciones señalen tiempos de espera y cancelaciones para cualquier llamada a un método bloqueante. Un método de bloqueo depende de un evento externo, como una entrada o salida de red, para continuar con su tarea.
Un ejemplo de un método de bloqueo es el InsertOne()
Método. Si desea realizar una operación de inserción en un Collection en 10 segundos, puede usar un contexto con un tiempo de espera. Si la operación no se completa dentro del tiempo de espera, el método devuelve un error.
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client.Database("db").Collection("items").InsertOne(ctx, bson.D{{"x",1}})
Si el Contexto pasado a una operación no tiene una fecha límite, puede establecer una opción Timeout en su Client y la operación derivará las especificaciones del tiempo de espera de esta configuración. Para aprender más sobre el uso de la configuración de tiempo de espera único, consulta la
Limitar el tiempo de ejecución del servidor en la guía Opciones de conexión.
Caducidad
El driver considera que un contexto ha expirado cuando una operación supera el tiempo de espera o se cancela. El driver comprueba la expiración del Context usando el método Done().
Las siguientes secciones describen cuándo y cómo el controlador verifica la caducidad.
Selección de servidores
El controlador podría bloquear una llamada a un método si no puede seleccionar un servidor para una operación.
En este escenario, el controlador realiza bucles hasta encontrar un servidor para utilizar en la operación. Después de cada iteración, el controlador devuelve un error de tiempo de espera de selección de servidor si el contexto expiró o si el proceso de selección tardó más que el ajuste serverSelectionTimeoutMS.
Para obtener más información sobre cómo el driver selecciona un servidor, consulta la sección nivel de consistencia de lectura en la guía Configurar operaciones CRUD.
Checkout de Conexión
El controlador podría bloquear una llamada a un método si no hay conexiones disponibles para verificar.
Tras seleccionar un servidor, el driver intenta obtener una conexión del pool de conexiones del servidor. Si el contexto caduca mientras se verifica una conexión, el método devuelve un error de tiempo de espera.
Establecimiento de conexión
El driver podría bloquear una llamada de método si debe crear una nueva conexión.
Cuando el driver crea una nueva conexión para realizar una operación, el Contexto establece un timeout para el proceso de establecimiento. El driver establece el timeout ya sea para el vencimiento del Contexto o el timeout de conexión, lo que sea más corto.
El siguiente ejemplo establece el tiempo de espera de la conexión en 1 segundo y la fecha límite del contexto en 2 segundos. Dado que el tiempo de espera de la conexión es menor, el proceso de establecimiento expira después de 1 segundo.
opts := options.Client() opts.SetConnectTimeout(1*time.Second) client, err := mongo.Connect(opts) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() client.Database("<db>").Collection("<collection>").InsertOne(ctx, bson.D{{"x",1}})
Lectura y guardado de sockets
Cuando el driver recupera una conexión para una operación, establece la fecha límite de lectura o escritura del socket a la fecha límite del Context o a la del tiempo de espera del socket, la que sea más corta.
Si cancelas el Contexto después de ejecutar el método Read() o Write(), pero antes de que venza el plazo, el comportamiento del driver varía según la versión.
El driver genera una goroutine separada para escuchar la cancelación del Context cuando el método Read() o Write() está en progreso. Si la goroutine detecta una cancelación, cierra la conexión. El método pendiente Read() o Write() devuelve un error que el controlador sobrescribe con el error context.Canceled.
Importante
En versiones anteriores a 1.5.0, el controlador no detecta la cancelación del Context y espera que se devuelva el método Read() o Write().