Comment fermer Boto S3 connexion?
Je suis en utilisant Boto pour se connecter à Amazon S3 dans mon programme Python. Je suis capable d'ouvrir une connexion et le téléchargement des fichiers à un seau. J'ai pensé que je devrais puis fermer la connexion à libérer des ressources et, plus important, pour éviter les risques de sécurité de quitter une connexion ouverte traîner. Je suppose que je devrais appeler la méthode close (). Mais je l'ai testé comme suit:
1. Ouvrir la connexion.
2. Fermeture de la connexion.
3. Télécharger le fichier dans le seau.
J'ai compris l'étape 3 serait un échec, mais le téléchargement a fonctionné! Donc, ce n'est close() faire? Si ce n'est pas vraiment fermer la connexion, que dois-je utiliser à la place de close()? Ou est-ce inutile de fermer la connexion?
J'ai cherché la réponse dans la Boto tutoriel, le Boto référence de l'API, et cette StackOverflow post, mais pas de chance jusqu'à présent.
Merci pour votre aide.
Vous devez vous connecter pour publier un commentaire.
Votre étape 3 a fonctionné parce que boto a code sera automatiquement ré-ouvrir et de fermer des connexions et de réessayer de demandes sur les erreurs. Il n'y a rien à gagner à manuellement la fermeture de la boto connexions, car ils sont juste les connexions HTTP et se ferme automatiquement après quelques minutes d'inactivité. Je ne serais pas s'inquiéter d'essayer de les fermer.
Sous les couvertures, boto utilise httplib. Cette bibliothèque client supporte le protocole HTTP 1.1 Keep-Alive, de sorte qu'il peut et doit garder le socket ouvert de sorte qu'il peut effectuer plusieurs demandes sur la même connexion.
connection.close()
n'est pas vraiment le sous-jacent sockets. Au lieu de cela, il supprime la référence à la sous-jacentes de la piscine de httplib connexions, ce qui permet le garbage collector pour s'exécuter sur eux, et c'est le moment de la prise de fermer arrive.Évidemment, vous pouvez également laisser le garbage collector exécuter en ne gardant pas une référence pour le nom de boto connexion elle-même. Mais il y a des avantages de performance de réutiliser le nom de boto connexion (voir, par exemple, le Keep-Alive note ci-dessus).
Heureusement, dans la plupart des cas, vous n'avez pas à appeler
connection.close()
explicitement. Pour plus de détails sur l'un des cas où vous N'avez qu'à appeler close, voir ma réponse à le StackOverflow post qui est liée à la question.Il existe au moins un exemple où de quitter cette connexion ouverte peut entraîner un échec. La réponse ci-dessus m'a conduit à la solution. Ci-dessous, addUnverifiedEmail ne AWS RDS DB de l'insertion. Ainsi, la boto3 connexion est toujours dans la portée et active lors de la tentative de faire de l'insertion. C'est à partir de mon Lambda (python).
Ce qui a entraîné l' (erreur 1205 Verrouillage de délai d'attente dépassé). Ci-dessous, addUserToCognito crée la boto3 de connexion et il est hors de portée avant de l'insérer.
L'insert réussi après cette modification. Heureusement pour moi, addUnverifiedEmail était le dernier appel de fonction à l'intérieur de addUserToCognito de sorte qu'il était facile de se déplacer à l'extérieur. D'autres, plus complexes, le code ne peut pas avoir la même capacité. Donc, au client.close() ne fait fermer la connexion et de le garder fermé pourrait être une assez grosse faille.
boto3.client('cognito-idp')
? Et l'erreur que vous voyez est une erreur MySQL liés à l'verrouillé les enregistrements sur votre RDS exemple? Je suis confus quant à la façon dont ils sont liés. Est le cognito-idp écrit à MySQL ainsi? Avez-vous lié cognito pour créer DB utilisateurs? Peut-être que votreaddUnverifiedEmail
insert est bloqué par cognito également de faire un insert? Pourquoi est-il à la fois la signature et l'ajout de non vérifiés pour le même email de l'utilisateur?