python - requests - La aplicación web se cuelga durante varias horas en ssl.py en self._sslobj.do_handshake()
requests html python (2)
Después de navegar a través de la sección de Python de Stack Overflow, encontré algo que puede no solucionar el problema central que causa el problema, pero definitivamente es lo suficientemente bueno como para manejar cualquier situación en la que aparezca este problema. La siguiente pregunta tiene varias soluciones que arrojarán algún tipo de excepción si una función demora demasiado en completarse. Así es como resolví este problema al final. La respuesta principal es solo para UNIX, sin embargo, hay otros que utilizan subprocesos y funcionan en todas las plataformas:
Función de tiempo de espera si tarda demasiado tiempo en terminar
Este es un tema extraño que honestamente es bastante difícil de reproducir. Solo lo he visto dos veces después de miles y miles de llamadas a la API. Creo que es bastante improbable que alguien llegue a una solución mejor que esta, que es una especie de truco, pero definitivamente resuelve el problema. Puede lanzar una excepción y luego volver a intentar la conexión SSL o continuar con otra parte de su programa.
Creo que mi respuesta será suficiente por ahora, pero si alguien tiene algo mejor, siéntase libre de ofrecerlo. Honestamente, parece que la única solución para el problema subyacente podría ser una corrección de errores en la biblioteca ssl.py real, pero es imposible para mí asegurarlo.
Estoy usando Python 2.7.5. Tengo una aplicación web que consulta una API cada pocos minutos y ha estado funcionando con éxito durante el último día. Sin embargo, después de dejarlo sentado por unas horas, volví para encontrar mi programa estancado sin actividad durante varias horas. Abandoné el programa y descubrí que se ha estancado en el método ssh Handshake durante la mayor parte del día, durante una de las llamadas a la API.
Aquí está el rastro:
...
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 143, in __init__
self.do_handshake()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 305, in do_handshake
self._sslobj.do_handshake()
Hice una pequeña investigación, y parece que esto fue un problema con las bibliotecas SSL en Python 2.6, pero desde entonces se ha solucionado. Me pregunto por qué mi programa se atascó aquí sin lanzar una excepción o algo así.
Si hay una manera de establecer un tiempo de espera para el método de intercambio de SSL, con mucho gusto lo haría, ya que me gustaría evitar que mi programa se detenga indefinidamente por algo como esto nuevamente. Estoy usando la biblioteca HTTP de solicitudes y esto se ejecuta en Mac OSX 10.9, si eso importa. Sugerencias?
EDITAR: Hice una investigación, y parece que otros han tenido este problema específico con SSL , a pesar de la "corrección" implementada en 2.6. Sin embargo, no estoy seguro de cuál es la solución todavía. Cualquier ayuda es apreciada.
EDIT 3: Agregué mi solución como respuesta a esta pregunta.
Me encontré con esto y pude socket.setdefaulttimeout usando socket.setdefaulttimeout . socket.setdefaulttimeout
modifica el comportamiento de todos los sockets creados después de llamarlo, lo cual es conveniente si el socket está encapsulado en el código de la biblioteca. Si tiene acceso a un socket SSL específico, probablemente pueda usar socket.settimeout
.