python - Web 应用程序在 self._sslobj.do_handshake() 的 ssl.py 中挂起几个小时

标签 python ssl pyopenssl

我使用的是 Python 2.7.5。我有一个网络应用程序,它每隔几分钟就会查询一次 API,并且在最后一天左右一直在成功运行。然而,在让它静置几个小时后,我回来发现我的程序停滞了几个小时没有任何事件。我退出了程序,发现它在 ssl 握手方法中的大部分时间都在其中一个 API 调用期间停滞不前。

这是回溯:

...
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()

我做了一些研究,这似乎是 Python 2.6 中 SSL 库的问题,但它已经得到修复。我想知道为什么我的程序没有抛出异常或任何东西就卡在这里了。

如果有办法为 SSL 握手方法设置超时,我很乐意这样做,因为我想避免我的程序再次因为类似的事情而无限期地停止。我正在使用 Requests HTTP 库,它在 Mac OSX 10.9 上运行,如果这很重要的话。有什么建议吗?

编辑: 我做了一些研究,it seems that others have had this specific problem with SSL ,尽管在 2.6 中实现了“修复”。但是,尚不确定解决方案是什么。任何帮助表示赞赏。

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

最佳答案

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

Timeout function if it takes too long to finish

这是一个奇怪的问题,老实说很难重现。在成千上万的 API 调用之后,我只看到过两次。我认为不太可能有人会找到比这个更好的解决方案,这有点像 hack,但绝对可以解决问题。您可以抛出异常,然后再次尝试 SSL 连接,或者继续执行程序的另一部分。

我认为我的回答现在就足够了,但如果有人有更好的东西,请随时提供。老实说,似乎对潜在问题的唯一修复可能是实际 ssl.py 库中的错误修复,但我无法肯定地说。

关于python - Web 应用程序在 self._sslobj.do_handshake() 的 ssl.py 中挂起几个小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19938593/

相关文章:

python - 如何修复来自数据库的 Python 请求/BeautifulSoup 响应

security - 在 WinINet 中手动验证服务器证书

python - 请求.exceptions.SSLError

找不到 python crypto.sign,尽管它在模块中

python - 通过parse命令使用spider时如何在Scrapy中使用管道

python - 带 turtle 图形的 14 段显示

python - Jenkinsfile 语法 - 是否有共享 python 构建步骤的 DRY 示例?

Java异常客户端认证TLS : password must not be null

android - 如何避免使用 SSL 信任 killer 应用程序绕过 Okhttp 证书固定?

python-3.x - 无法为 Python 3 安装 pyOpenSSL