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