2013-08-12 31 views
34

Thư viện phổ biến của Requests của Python được cho là an toàn chỉ trên trang chủ của nó, nhưng không cung cấp thêm chi tiết nào. Nếu tôi gọi requests.session(), tôi có thể vượt qua một cách an toàn sau đó đối tượng này với nhiều chủ đề như vậy:Đối tượng Session từ chuỗi thư viện Yêu cầu của Python có an toàn không?

session = requests.session() 
for i in xrange(thread_count): 
    threading.Thread(
     target=target, 
     args=(session,), 
     kwargs={} 
    ) 

và đưa ra yêu cầu sử dụng hồ bơi kết nối giống nhau ở nhiều chủ đề?

Nếu vậy, đây có phải là cách tiếp cận được khuyến nghị hay mỗi thread phải có hồ bơi kết nối riêng? (Giả sử tổng kích thước của tất cả các nhóm kết nối riêng lẻ được cộng lại với kích thước của một hồ bơi kết nối lớn, giống như ở trên.) Các ưu và khuyết điểm của mỗi phương pháp tiếp cận là gì?

+0

Bạn đã tìm ra cái nào tốt hơn? Tôi hiện đang chạy vào gần như cùng một câu hỏi. Tôi đã suy nghĩ một phiên mới cho mỗi thread để không tắc nghẽn tất cả các yêu cầu trong một hồ bơi kết nối duy nhất. –

+0

@Marcel Wilson Không chính xác. Mặc dù cho một trong các dự án của tôi, nơi tôi đã sử dụng một đối tượng phiên để yêu cầu cùng một URL hơn và hơn nữa, tôi đã gửi cùng một đối tượng phiên cho tất cả các chủ đề. Ứng dụng này dường như hoạt động, nhưng tôi vẫn không chắc chắn cách tiếp cận tốt hơn là gì. Tuy nhiên, lưu ý rằng vấn đề của tôi không bị nghẽn cổ chai các kết nối, mà thay vào đó là mở quá nhiều kết nối và gửi quá nhiều yêu cầu cùng một lúc. – dg123

+0

Yêu cầu được xây dựng trên đầu trang của urllib3. Chủ đề an toàn của các yêu cầu phần lớn là do thread-an toàn của urllib3, các doucmentation mà thảo luận về thread an toàn chi tiết hơn. – selllikesybok

Trả lời

17

Sau khi xem xét nguồn của requests.session, tôi sẽ nói đối tượng phiên có thể là an toàn luồng, tùy thuộc vào việc triển khai CookieJar đang được sử dụng.

Session.prepare_request đọc từ self.cookies, và Session.send gọi extract_cookies_to_jar(self.cookies, ...), và rằng các cuộc gọi jar.extract_cookies(...) (jarself.cookies trong trường hợp này).

Nguồn cho Python 2.7's cookielib mua lại một khóa (threading.RLock) trong khi nó cập nhật bình, vì vậy nó có vẻ là chỉ an toàn. Mặt khác, các documentation for cookielib không nói gì về an toàn thread, vì vậy có lẽ tính năng này không nên phụ thuộc vào?

CẬP NHẬT

Nếu chủ đề của bạn được biến đổi bất kỳ thuộc tính của đối tượng session như headers, proxies, stream, vv hoặc gọi phương thức mount hoặc sử dụng phiên với tuyên bố with, vv sau đó nó không phải là chỉ an toàn.

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