Est l'objet de Session à partir de Python Demandes de la bibliothèque de threads?
Python populaire Les demandes bibliothèque est dit être thread-safe sur sa page d'accueil, mais sans plus de détails sont donnés. Si je l'appelle requests.session()
, puis-je en toute sécurité passer cet objet de plusieurs threads comme suit:
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
et de faire des requêtes à l'aide du même pool de connexion à plusieurs threads?
Si oui, est-ce l'approche recommandée, ou chaque thread doit disposer de son propre pool de connexion? (En supposant que la taille totale de tous les pools de connexions individuelles additionnées à la taille de ce qui serait un gros pool de connexion, comme ci-dessus.) Quels sont les avantages et les inconvénients de chaque approche?
- A vous de déterminer qui est le meilleur? Je suis actuellement en cours d'exécution dans près de la même question. Je pensais à une nouvelle session pour chaque thread afin de ne pas goulot d'étranglement toutes les demandes dans un seul pool de connexion.
- Wilson Pas exactement. Bien que pour un de mes projets où j'ai été en utilisant un objet de session pour demander la même URL, encore et encore, j'ai envoyé le même objet session pour tous les threads. L'application ne semble pas fonctionner, mais je ne suis toujours pas sûr de ce que la meilleure approche est de. Notez, cependant, que mon problème n'était pas avec les goulots d'étranglement les pools de connexion, mais plutôt avec l'ouverture d'un trop grand nombre de connexions et de l'envoi de trop de requêtes à la fois.
- Les demandes construit sur le haut de urllib3. Le fil de sécurité de demandes est en grande partie en raison de la fil-sécurité des urllib3, le doucmentation pour qui traite de la sécurité des threads dans le plus grand détail.
- J'ai fini par créer une session dans la boucle for. Chaque thread obtient son propre pool de connexion.
Vous devez vous connecter pour publier un commentaire.
Après examen de la source de
demandes.session
, je vais dire l'objet de session peut être thread-safe, en fonction de la mise en œuvre de CookieJar utilisé.Session.prepare_request
lit deself.cookies
, etSession.send
appelsextract_cookies_to_jar(self.cookies, ...)
, et que les appelsjar.extract_cookies(...)
(jar
êtreself.cookies
dans ce cas).La source pour Python 2.7 est
cookielib
acquiert un verrou (threading.RLock
), tandis qu'il met à jour le jar, de sorte qu'il semble être thread-safe. D'autre part, la documentation decookielib
ne dit rien au sujet du thread, la sécurité, alors peut-être que cette fonctionnalité ne doit pas être dépendait?Mise à JOUR
Si vos fils sont la mutation de tous les attributs de l'objet session comme
headers
,proxies
,stream
, etc. ou en appelant lemount
méthode ou à l'aide de la session avec lewith
déclaration, etc. alors il n'est pas thread-safe.https://github.com/kennethreitz/requests/issues/1871 implique que la Session n'est pas thread-safe, et qu'au moins un mainteneur recommande une Séance par thread.
Je viens d'ouvrir https://github.com/kennethreitz/requests/issues/2766 à préciser la documentation.