La aplicación web se cuelga durante varias horas en ssl.py en self._sslobj.do_handshake ()

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 progtwig estancado sin actividad durante varias horas. Abandoné el progtwig 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 progtwig 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 progtwig 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.

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

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.

Me encontré con esto y pude solucionarlo 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 .