¿Es seguro el objeto de sesión del hilo de la biblioteca Peticiones de Python?
thread-safety connection-pooling (2)
Después de revisar el origen de requests.session
, voy a decir que el objeto de sesión podría ser seguro para subprocesos, dependiendo de la implementación de CookieJar que se utilice.
Session.prepare_request
lee de self.cookies
, y Session.send
llama a extract_cookies_to_jar(self.cookies, ...)
, y llama a jar.extract_cookies(...)
( jar
siendo self.cookies
en este caso).
La fuente de cookielib
Python 2.7 adquiere un bloqueo ( threading.RLock
) mientras actualiza el jar, por lo que parece ser seguro para subprocesos. Por otro lado, la documentación de cookielib
no dice nada acerca de la seguridad de las hebras, ¿entonces tal vez no se debe depender de esta característica?
ACTUALIZAR
Si sus subprocesos están mutando los atributos del objeto de la sesión, como headers
, proxies
, stream
, etc., o llamando al método de mount
o utilizando la sesión con la declaración with
, etc., entonces no es seguro para subprocesos.
Se dice que la popular biblioteca de Requests Python es segura para subprocesos en su página de inicio, pero no se dan más detalles. Si llamo a requests.session()
, ¿puedo pasar este objeto de forma segura a múltiples hilos de esta manera?
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
y hacer solicitudes usando el mismo grupo de conexiones en múltiples hilos?
Si es así, ¿es este el enfoque recomendado, o cada hilo debe tener su propio grupo de conexión? (Suponiendo que el tamaño total de todas las agrupaciones de conexiones individuales se suma al tamaño de lo que sería una gran agrupación de conexiones, como la anterior). ¿Cuáles son los pros y los contras de cada enfoque?
https://github.com/kennethreitz/requests/issues/1871 implica que la sesión no es segura para subprocesos, y que al menos un mantenedor recomienda una sesión por subproceso.
Acabo de abrir https://github.com/kennethreitz/requests/issues/2766 para aclarar la documentación.