web-dev-qa-db-fra.com

L'objet Session du thread de bibliothèque de requêtes Python est-il sûr?

La populaire bibliothèque Python Requests est dite thread-safe sur sa page d'accueil, mais aucun autre détail n'est donné. Si j'appelle requests.session(), puis-je alors passer cet objet en toute sécurité à plusieurs threads comme ceci:

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

et faire des demandes en utilisant le même pool de connexions dans plusieurs threads?

Si tel est le cas, est-ce l'approche recommandée ou doit-on attribuer à chaque thread son propre pool de connexions? (En supposant la taille totale de tous les pools de connexions individuels additionnée à la taille de ce qui serait un grand pool de connexions, comme celui ci-dessus.) Quels sont les avantages et les inconvénients de chaque approche?

43
DJG

Après avoir examiné la source de requests.session , je vais dire que l'objet session peut être thread-safe, selon l'implémentation de CookieJar utilisé.

Session.prepare_request Lit à partir de self.cookies, Et Session.send Appelle extract_cookies_to_jar(self.cookies, ...), et cela appelle jar.extract_cookies(...) (jar étant self.cookies Dans ce cas).

La source de cookielib de Python 2.7 acquiert un verrou (threading.RLock) Pendant qu'il met à jour le bocal, donc il semble être thread-safe. D'un autre côté, la documentation pour cookielib ne dit rien sur la sécurité des threads, alors peut-être que cette fonctionnalité ne devrait pas dépendre?

METTRE À JOUR

Si vos threads mutent des attributs de l'objet session tels que headers, proxies, stream, etc. ou en appelant la méthode mount ou en utilisant la session avec l'instruction with, etc. alors ce n'est pas thread-safe.

22
millerdev

https://github.com/kennethreitz/requests/issues/1871 implique que la session n'est pas sécurisée pour les threads et qu'au moins un responsable recommande une session par thread.

Je viens d'ouvrir https://github.com/kennethreitz/requests/issues/2766 pour clarifier la documentation.

22
Greg Ward