python - aws - ¿Cómo cerrar la conexión de Boto S3?
install boto3 raspberry pi (3)
Debajo de las portadas, boto usa httplib. Esta biblioteca cliente es compatible con HTTP 1.1 Keep-Alive, por lo que puede y debe mantener el socket abierto para que pueda realizar múltiples solicitudes a través de la misma conexión.
connection.close()
no cierra realmente los sockets subyacentes. En su lugar, elimina la referencia al grupo subyacente de conexiones httplib, lo que permite que el recolector de basura se ejecute en ellas, y ahí es cuando se produce el cierre del socket real.
Obviamente, también puede dejar que el recolector de basura se ejecute al no mantener una referencia a la conexión Boto. Pero hay ventajas de rendimiento al reutilizar la conexión de boto (p. Ej., Ver la nota Keep-Alive arriba).
Afortunadamente, en la mayoría de los casos, no tiene que llamar a connection.close()
explícitamente. Para obtener más detalles sobre un caso en el que TIENE que cerrar, vea mi respuesta a la publicación de StackOverflow que está vinculada en la pregunta.
Estoy usando Boto para conectarme a Amazon S3 en mi programa Python. Soy capaz de abrir una conexión y subir archivos a un cubo. Pensé que debería cerrar la conexión para liberar recursos y, lo que es más importante, evitar cualquier riesgo de seguridad al dejar una conexión abierta dando vueltas. Supuse que debería llamar al método close (). Pero he probado esto de la siguiente manera: 1. Abrir la conexión. 2. Cierre la conexión. 3. Sube el archivo al cubo.
Pensé que el paso 3 fallaría, ¡pero la carga funcionó! Entonces, ¿qué hace el cierre ()? Si realmente no cierra la conexión, ¿qué debo usar en lugar de cerrar ()? ¿O es simplemente innecesario cerrar la conexión?
He buscado la respuesta en el tutorial de Boto , la referencia de la API de Boto y esta publicación de StackOverflow , pero hasta ahora no he tenido suerte.
Gracias por tu ayuda.
Hay al menos una instancia donde dejar esta conexión abierta puede causar un error. La respuesta anterior me llevó a la solución. A continuación, addUnverifiedEmail realiza una inserción de AWS RDS DB. Por lo tanto, la conexión boto3 todavía está dentro del alcance y está activa cuando se intenta realizar la inserción. Esto es de mi Lambda (pitón).
boto3.client.sign_up(
ClientId=''xxxxxxxxxxxxxxxxxxxxxxxxxx'',
Username=self._user[''email''],
Password=self._user[''password''],
UserAttributes=attributes
)
dbUserInstance.addUnverifiedEmail(self._user[''email''])
Esto dio lugar a (error 1205 Tiempo de espera de espera de bloqueo excedido). A continuación, addUserToCognito crea la conexión boto3 y queda fuera del alcance antes de la inserción.
self.addUserToCognito()
dbUserInstance.addUnverifiedEmail(self._user[''email''])
La inserción tuvo éxito después de hacer este cambio. Por suerte para mí, addUnverifiedEmail fue la última función de llamada dentro de addUserToCognito, por lo que fue fácil moverlo afuera. Otro código, más complejo, puede no tener la misma habilidad. Entonces, client.close () en realidad no cerrar la conexión y mantenerla cerrada podría ser un defecto bastante grande.
Su paso 3 funcionó porque boto tiene un código que volverá a abrir automáticamente las conexiones cerradas y reintentará las solicitudes de errores. Hay poco que ganar al cerrar manualmente las conexiones de boto porque son solo conexiones HTTP y se cerrarán automáticamente después de unos minutos de inactividad. No me preocuparía tratar de cerrarlos.