Web应用程序在ssl.py中在self._sslobj.do_handshake()上挂了几个小时。

发布于 2021-01-29 17:15:25

我正在使用Python
2.7.5。我有一个网络应用程序,该应用程序每隔几分钟会查询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()

我做了一些研究,似乎这是Python 2.6中SSL库的问题,但此后已修复。我想知道为什么我的程序在不抛出异常或任何异常的情况下卡在这里。

如果有一种方法可以设置SSL握手方法的超时时间,那么我很乐意这样做,因为我希望避免我的程序被类似的事情无限期地停止。我正在使用Requests
HTTP库,如果有问题,它将在Mac OSX 10.9上运行。有什么建议吗?

编辑:
我进行了一些研究,尽管2.6中实现了“修复”,但似乎其他人也遇到了SSL的特定问题。但是,尚不确定解决方案是什么。任何帮助表示赞赏。

编辑3: 添加我的解决方案作为对此问题的答案。

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    超时功能(如果完成时间太长)

    这是一个奇怪的问题,实际上很难复制。在成千上万的API调用之后,我只见过两次。我认为,有人会找到比这更好的解决方案的可能性很小,这虽然有点可笑,但绝对可以解决问题。您可以引发异常,然后再次尝试SSL连接,或者继续执行程序的另一部分。

    我认为目前的答案就足够了,但是如果有人有更好的选择,请随时提出。老实说,似乎唯一解决此问题的方法可能是实际ssl.py库中的错误修复,但我无法肯定地说。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看