Python Web应用程序在ssl.py中挂起几个小时

Python Web应用程序在ssl.py中挂起几个小时,python,ssl,pyopenssl,Python,Ssl,Pyopenssl,我正在使用Python 2.7.5。我有一个web应用程序,它每隔几分钟查询一次API,并在最后一天左右成功运行。然而,在让它静置几个小时后,我回来发现我的程序停滞了几个小时,没有任何活动。我退出了这个程序,发现在一次API调用期间,它在ssl握手方法中被暂停了一天的大部分时间 以下是回溯: ... File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 143, in

我正在使用Python 2.7.5。我有一个web应用程序,它每隔几分钟查询一次API,并在最后一天左右成功运行。然而,在让它静置几个小时后,我回来发现我的程序停滞了几个小时,没有任何活动。我退出了这个程序,发现在一次API调用期间,它在ssl握手方法中被暂停了一天的大部分时间

以下是回溯:

...
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()
我做了一些研究,这似乎是Python2.6中SSL库的一个问题,但它已经被修复了。我想知道为什么我的程序在没有抛出异常或任何东西的情况下被困在这里

如果有一种方法可以为SSL握手方法设置超时,我很乐意这样做,因为我希望避免我的程序再次无限期地停止。我使用的是请求HTTP库,如果有必要的话,它运行在MacOSX10.9上。建议

编辑: 我做了一些研究,尽管在2.6中实现了“修复”。不过,目前还不确定解决方案是什么。感谢您的帮助

编辑3:
添加了我的解决方案作为对这个问题的回答。

浏览了Stack Overflow的Python部分后,我发现一些东西可能无法解决导致问题的核心问题,但肯定足以处理出现此问题的任何情况。下面的问题有各种各样的解决方案,如果函数需要太长时间才能完成,这些解决方案会引发某种异常。这就是我最终解决这个问题的方式。最重要的答案是只有UNIX,但是还有一些其他的使用线程并在每个平台上工作:

这是一个奇怪的问题,很难重现。在数千次API调用之后,我只见过它两次。我认为不太可能有人会找到比这个更好的解决方案,这是一种黑客行为,但肯定能解决问题。您可以抛出异常,然后再次尝试SSL连接,或者继续使用程序的另一部分


我想我的答案现在就足够了,但如果有人有更好的,请随时提出。老实说,似乎对底层问题的唯一修复可能是实际ssl.py库中的错误修复,但我无法确定这一点。

我遇到了这个问题,并能够使用
socket.setdefaulttimeout
修改调用它后创建的所有套接字的行为,如果套接字封装在库代码中,这很方便。如果您有权访问特定的SSL套接字,您可能可以使用
socket.settimeout

openssl s_客户端-connect mysslsservice.example.com:443返回什么?它可能在等待您提供客户端证书,或者陷入一个永远无法完成的证书验证中。我现在无法测试它,但正如我所说的,在那次调用之前,它一直工作得很好。当我重新启动服务时,它开始像以前一样从API中提取数据。我只是想知道为什么有一次它被卡住了。我经历了同样的错误,程序被卡住了10个多小时,直到我回到家重新启动它。我会利用你的变通办法。我是说Ubuntu 13.10.2.7.5+中的Python 2.7.3。我在看一台远程机器。听起来不错。是的,这个解决方案肯定会解决这个问题,至少在我能想象的任何情况下。我把它作为一个官方的“答案”添加了进来,所以如果它对你有帮助的话,如果你投我一票,我将不胜感激:)你能找到一个具体的解决办法吗?更重要的是,是什么触发了这个“问题”?