2012-07-24 27 views
11

Nếu tôi gọi boto.connect_xxx, trong đó xxx là một số dịch vụ (dynamodb, s3, vv) nhiều lần, mỗi lần tạo một hồ bơi kết nối mới? một cái gì đó như thế này những gì tôi muốn làm là (ví dụ trong Flask):Phương pháp Boto connect_xxx và các hồ kết nối

@app.before_request 
def before_request(): 
    g.db = connect_dynamodb() 

để chắc chắn rằng tôi luôn luôn kết nối, nhưng tôi không muốn làm điều này trước mỗi yêu cầu nếu nó sẽ tạo ra thẻ bảo mật mới , vv, toàn bộ rigamarole, mỗi lần. Có an toàn khi chỉ gọi connect_xxx() một lần khi ứng dụng bắt đầu, và dựa vào boto để tạo các kết nối mới khi cần thiết, v.v ...?

Trả lời

11

Cách tiếp cận tốt nhất là gọi phương thức connect_xxx một lần khi ứng dụng của bạn bắt đầu và dựa vào boto để quản lý kết nối từ đó trở đi. Ngoại lệ duy nhất cho quy tắc đó là nếu bạn đang sử dụng nhiều luồng. Trong trường hợp đó, mỗi thread sẽ tạo ra kết nối riêng của nó vì boto sử dụng httplib mà không phải là threadsafe.

Ngay cả khi bạn gọi phương thức connect_xxx trước mỗi yêu cầu, bạn thực sự vẫn ổn. Boto hồ bơi kết nối ở cấp lớp và nên xử lý này một cách khá hiệu quả.

+1

Cảm ơn câu trả lời! Và cảm ơn vì boto, tôi không thể sống thiếu nó. Đề cập đến các chủ đề của bạn đã nhắc một câu hỏi khác về chủ đề cùng chủ đề, [ở đây] (http://stackoverflow.com/questions/11640031/uwsgiflaskboto-thread-safety). –

+0

Có bất kỳ tài liệu tham khảo tài liệu nào có sẵn cho thông tin này không? –

+0

Các phương thức 'connect_xxx'' trả về một cá thể của một lớp con của' 'AWSAuthConnection'' thực sự là luồng an toàn. Bạn chỉ nên thực hiện điều này một lần cho mỗi tiến trình (và các đối số kết nối) - không phải trong mỗi luồng. Hồ bơi kết nối không được lưu trữ ở cấp lớp. – malthe

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