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

Python est populaire Demande sur sa page d'accueil, la Bibliothèque est considérée comme sûre, mais aucun autre détail n'est donné. Si je l'appelle requests.session(), puis-je alors passer en toute sécurité cet objet à plusieurs threads comme so:

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

et faire des requêtes en utilisant le même pool de connexion dans plusieurs threads?

Si oui, est-ce l'approche recommandée, ou chaque thread doit disposer de son propre pool de connexion? (En supposant la taille totale de tous les réservoirs de connexion individuels résumé à la taille de ce qui serait un grand bassin de connexion, comme celui ci-dessus.) Quels sont les avantages et les inconvénients de chaque approche?

36
demandé sur DJG 2013-08-12 17:19:02

2 réponses

après examen de la source de requests.session, je vais dire que l'objet session pourrait être thread-safe, dépendant de L'implémentation de CookieJar utilisée.

Session.prepare_request lit self.cookies et Session.send appelle extract_cookies_to_jar(self.cookies, ...), et qui appelle jar.extract_cookies(...) (jar étant self.cookies dans ce cas).

la source de Python 2.7 cookielib acquiert une serrure (threading.RLock) pendant qu'il met à jour le bocal, il semble donc être thread-safe. Sur l'autre la main, le documentation pour cookielib ne dit rien au sujet de la sécurité des fils, alors peut-être que cette caractéristique ne devrait pas être dépendante?

UPDATE

si vos threads sont en train de muter n'importe quel attribut de l'objet session tel que headers,proxies,stream, etc. ou en appelant le mount méthode ou utilisation de la session avec le with déclaration, etc. alors il n'est pas thread-safe.

18
répondu millerdev 2013-12-08 19:18:31

https://github.com/kennethreitz/requests/issues/1871 implique que Session n'est pas thread-safe, et qu'au moins un responsable recommande une Session par thread.

I just open https://github.com/kennethreitz/requests/issues/2766 pour clarifier la documentation.

15
répondu Greg Ward 2015-09-10 13:50:25