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?
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.
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.