2014-04-28 13 views
14

Tôi đang sử dụng Boto để kết nối với Amazon S3 trong chương trình Python của mình. Tôi có thể mở kết nối và tải tệp lên một nhóm. Tôi nghĩ rằng tôi nên đóng kết nối để giải phóng tài nguyên và, quan trọng hơn, để tránh bất kỳ rủi ro bảo mật nào từ việc để lại một kết nối mở đang treo xung quanh. Tôi cho rằng tôi nên gọi phương thức close(). Nhưng tôi đã thử nghiệm điều này như sau: 1. Mở kết nối. 2. Đóng kết nối. 3. Tải tệp lên thùng.Cách đóng kết nối Boto S3?

Tôi đã xác định bước 3 sẽ không thành công, nhưng quá trình tải lên đã hoạt động! Vì vậy, những gì hiện gần() làm gì? Nếu nó không thực sự đóng kết nối, những gì tôi nên sử dụng thay cho gần()? Hoặc là nó chỉ cần thiết để đóng kết nối?

Tôi đã tìm câu trả lời trong số Boto tutorial, Boto API referencethis StackOverflow post, nhưng không may mắn cho đến thời điểm này.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

6

Bước 3 của bạn hoạt động vì boto có mã sẽ tự động mở lại các kết nối đã đóng và thử lại các yêu cầu về lỗi. Có rất ít để đạt được bằng cách đóng các kết nối boto theo cách thủ công vì chúng chỉ là các kết nối HTTP và sẽ tự động đóng sau một vài phút không hoạt động. Tôi sẽ không lo lắng về việc cố gắng đóng chúng lại.

2

Dưới bìa, boto sử dụng httplib. Thư viện máy khách này hỗ trợ HTTP 1.1 Keep-Alive, vì vậy nó có thể và nên giữ cho socket mở để nó có thể thực hiện nhiều yêu cầu trên cùng một kết nối.

connection.close() không thực sự đóng các ổ cắm bên dưới. Thay vào đó, nó loại bỏ tham chiếu đến nhóm kết nối cơ bản của các kết nối httplib, cho phép bộ thu gom rác chạy trên chúng, và đó là khi việc đóng socket thực sự xảy ra.

Rõ ràng, bạn cũng có thể cho phép bộ thu gom rác chạy bằng cách không giữ tham chiếu đến chính kết nối boto. Nhưng có lợi ích hiệu suất để tái sử dụng kết nối boto (ví dụ: xem ghi chú Keep-Alive ở trên).

May mắn thay, trong hầu hết các trường hợp, bạn không phải gọi số connection.close() một cách rõ ràng. Để biết thêm chi tiết về một trường hợp mà bạn KHÔNG phải gọi gần, hãy xem câu trả lời của tôi cho the StackOverflow post được liên kết trong câu hỏi.

0

Có ít nhất một trường hợp khi rời khỏi kết nối này mở có thể gây ra lỗi. Câu trả lời ở trên đã dẫn tôi đến giải pháp. Bên dưới, addUnverifiedEmail thực hiện chèn AWS RDS DB. Vì vậy, kết nối boto3 vẫn còn trong phạm vi và hoạt động khi cố gắng thực hiện chèn. Đây là từ Lambda của tôi (python).

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

Điều này dẫn đến (lỗi 1205 Thời gian chờ khóa vượt quá). Bên dưới, addUserToCognito tạo kết nối boto3 và nó nằm ngoài phạm vi trước khi chèn.

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

Đã chèn thành công sau khi thực hiện thay đổi này. May mắn cho tôi, addUnverifiedEmail là cuộc gọi hàm cuối cùng bên trong addUserToCognito để dễ dàng di chuyển nó ra bên ngoài. Khác, phức tạp hơn, mã có thể không có khả năng tương tự. Vì vậy, client.close() không thực sự đóng kết nối và giữ nó đóng cửa có thể là một lỗ hổng khá lớn.

Các vấn đề liên quan