python - क्या पायथन के अनुरोध पुस्तकालय धागे से सत्र वस्तु सुरक्षित है?




thread-safety connection-pooling (2)

पायथन की लोकप्रिय Requests लाइब्रेरी को उसके होम पेज पर थ्रेड-सुरक्षित कहा गया है, लेकिन आगे कोई विवरण नहीं दिया गया है। अगर मैं requests.session() कहता हूं, तो क्या मैं इस ऑब्जेक्ट को सुरक्षित रूप से कई थ्रेड्स जैसे पास कर सकता हूं:

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

और कई थ्रेड्स में एक ही कनेक्शन पूल का उपयोग करके अनुरोध करें?

यदि हां, तो क्या यह अनुशंसित दृष्टिकोण है, या प्रत्येक थ्रेड को अपना कनेक्शन पूल दिया जाना चाहिए? (सभी व्यक्तिगत कनेक्शन पूलों के कुल आकार को माना जाता है कि ऊपर दिए गए एक के समान एक बड़ा कनेक्शन पूल क्या होगा।) प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष क्या हैं?


Request.session के स्रोत की समीक्षा करने के बाद, मैं कहने वाला हूं कि सत्र ऑब्जेक्ट थ्रेड-सुरक्षित हो सकता है, जो कि कुकीज के उपयोग पर निर्भर करता है।

Session.prepare_request self.cookies से पढ़ता है, और Session.send extract_cookies_to_jar(self.cookies, ...) को कॉल करता है, और जो jar.extract_cookies(...) ( jar इस मामले में self.cookies कहता है extract_cookies_to_jar(self.cookies, ...) को कॉल jar.extract_cookies(...)

पायथन 2.7 के cookielib लिए स्रोत एक लॉक ( threading.RLock cookielib प्राप्त करता है जबकि यह जार को अपडेट करता है, इसलिए यह थ्रेड-सुरक्षित प्रतीत होता है। दूसरी ओर, cookielib लिए प्रलेखन थ्रेड-सेफ्टी के बारे में कुछ भी नहीं कहता है, इसलिए शायद इस सुविधा पर निर्भर नहीं होना चाहिए?

अद्यतन करें

यदि आपके थ्रेड सत्र ऑब्जेक्ट के किसी भी विशेषता जैसे कि headers , proxies , stream आदि को म्यूट कर रहे हैं या mount विधि को कॉल कर रहे हैं या सत्र with स्टेटमेंट के with उपयोग कर रहे हैं, आदि तो यह थ्रेड-सुरक्षित नहीं है।


https://github.com/kennethreitz/requests/issues/1871 तात्पर्य है कि सत्र थ्रेड-सुरक्षित नहीं है, और यह कि कम से कम एक अनुरक्षक प्रति सत्र एक सेशन की सिफारिश करता है।

मैंने दस्तावेज़ीकरण को स्पष्ट करने के लिए सिर्फ https://github.com/kennethreitz/requests/issues/2766 खोला।





python-requests