Подтвердить что ты не робот

Как закрыть соединение Boto S3?

Я использую Boto для подключения к Amazon S3 в моей программе Python. Я могу открыть соединение и загрузить файлы в ведро. Я решил, что я должен закрыть соединение для выпуска ресурсов и, что более важно, избежать любых угроз безопасности, оставляя открытое соединение висящим. Я предположил, что должен называть метод close(). Но я протестировал это следующим образом: 1. Откройте соединение. 2. Закройте соединение. 3. Загрузите файл в корзину.

Я понял, что шаг 3 не удался, но загрузка работала! Итак, что делает close()? Если это действительно не закрывает соединение, что я должен использовать вместо close()? Или просто не нужно закрывать соединение?

Я искал ответ в учебнике Boto, Ссылка Boto API и qaru.site/info/412599/..., но пока не повезло.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Ваш шаг 3 работал, потому что у boto есть код, который автоматически возобновит закрытые соединения и повторит запросы на ошибки. Недостаточно получить ручное закрытие соединений boto, потому что они являются только HTTP-соединениями и автоматически закрываются через несколько минут бездействия. Я бы не стал беспокоиться о попытке закрыть их.

Ответ 2

Под обложками boto использует httplib. Эта клиентская библиотека поддерживает HTTP 1.1 Keep-Alive, поэтому она может и должна держать сокет открытым, чтобы он мог выполнять несколько запросов по одному и тому же соединению.

connection.close() фактически не закрывает базовые сокеты. Вместо этого он удаляет ссылку на базовый пул соединений httplib, который позволяет сборщику мусора запускать на них, и что при фактическом закрытии сокета.

Очевидно, вы также можете позволить сборщику мусора работать, не сохраняя ссылки на само соединение boto. Но есть преимущества в производительности для повторного использования соединения boto (например, см. Примечание Keep-Alive выше).

К счастью, в большинстве случаев вам не нужно явно вызывать connection.close(). Для получения более подробной информации об одном случае, когда вам нужно позвонить close, см. Мой ответ на fooobar.com/questions/412599/..., связанное в вопросе.

Ответ 3

Существует, по крайней мере, один экземпляр, в котором исключение этого соединения может привести к сбою. Ответ выше привел меня к решению. Ниже, addUnverifiedEmail делает вставку AWS RDS DB. Таким образом, соединение boto3 все еще находится в области действия и активно при попытке сделать вставку. Это из моей Lambda (python).

boto3.client.sign_up(
                ClientId='xxxxxxxxxxxxxxxxxxxxxxxxxx',
                Username=self._user['email'],
                Password=self._user['password'],
                UserAttributes=attributes
)
dbUserInstance.addUnverifiedEmail(self._user['email'])

В результате (превышено превышение времени ожидания ожидания 1205). Ниже addUserToCognito создает соединение boto3 и выходит из области действия перед вставкой.

self.addUserToCognito()
dbUserInstance.addUnverifiedEmail(self._user['email'])

Вставка удалась после внесения этого изменения. К счастью для меня, addUnverifiedEmail был последним вызовом функции внутри addUserToCognito, поэтому было легко перемещать его снаружи. Другой, более сложный код может не иметь такой же способности. Таким образом, client.close() фактически не закрывает соединение и не закрывает его, может быть довольно большим недостатком.