2013-08-12 13 views
34

Popularna biblioteka Pythona o nazwie Requests jest uważana za wątkową na swojej stronie głównej, ale nie podano dalszych szczegółów. Jeśli zadzwonię requests.session(), mogę potem bezpiecznie przekazać ten obiekt do wielu wątków tak:Czy obiekt Session z wątku biblioteki zapytań Pythona jest bezpieczny?

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

i żądań przy użyciu tej samej puli połączeń w wielu wątków?

Jeśli tak, czy jest to zalecana metoda, czy też każdy wątek powinien mieć własną pulę połączeń? (Zakładając, że łączna wielkość wszystkich pojedynczych pul połączeń zostanie zsumowana do wielkości jednej dużej puli połączeń, takiej jak powyższa.) Jakie są plusy i minusy każdego podejścia?

+0

Czy wiesz, co jest lepsze? Aktualnie mam prawie to samo pytanie. Myślałem o nowej sesji dla każdego wątku, aby nie zawęzić wszystkich żądań w jednej puli połączeń. –

+0

@Marcel Wilson Niezupełnie. Chociaż w przypadku jednego z moich projektów, w którym używałem obiektu sesji, aby wielokrotnie żądać tego samego adresu URL, wysłałem ten sam obiekt sesji do wszystkich wątków. Aplikacja wydaje się działać, ale nadal nie jestem pewien, jakie jest lepsze podejście. Zauważ jednak, że moim problemem nie było wąskie gardło w pulach połączeń, ale zamiast tego otwierałem zbyt wiele połączeń i wysyłałem zbyt wiele żądań na raz. – dg123

+0

Żądania są tworzone na górze urllib3. Bezpieczeństwo zapytań w wątku jest w dużej mierze spowodowane bezpieczeństwem wątków urllib3, dublowaniem, dla którego omawia się bardziej szczegółowo bezpieczeństwo wątku. – selllikesybok

Odpowiedz

17

Po przejrzeniu źródła requests.session, powiem, że obiekt sesji może być wątkowo bezpieczny, w zależności od implementacji używanego CookieJar.

Session.prepare_request czyta z self.cookies i Session.send wzywa extract_cookies_to_jar(self.cookies, ...) i że wzywa jar.extract_cookies(...) (jar będąc self.cookies w tym przypadku).

Źródło Python 2.7's cookielib nabywa blokadę (threading.RLock) podczas aktualizacji słoika, więc wygląda na wątek bezpieczny. Z drugiej strony, documentation for cookielib nic nie mówi o bezpieczeństwie wątków, więc może ta funkcja nie powinna być zależna?

UPDATE

Jeśli wątki są mutowania żadnych atrybutów obiektu sesji, takie jak headers, proxies, stream itp lub wywołanie metody mount lub przy użyciu sesji z rachunku with, itd. To nie jest Wątek bezpieczny.