Web应用在ssl.py文件在自我_握手()

2024-04-16 20:00:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.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()

我做了一些研究,似乎这是python2.6中SSL库的一个问题,但是它已经被修复了。我想知道为什么我的程序在没有抛出异常或其他任何东西的情况下被困在这里。在

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

编辑: 我做了一些研究,it seems that others have had this specific problem with SSL,尽管在2.6中实现了“修复”。不过,还不确定解决办法是什么。感谢任何帮助。在

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


Tags: 方法程序apisslliblibraryframeworkversions
2条回答

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

Timeout function if it takes too long to finish

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

我想我的答案现在就足够了,但是如果有人有更好的东西,请随时提出。老实说,对于潜在问题的唯一解决方法可能是实际中的bug修复ssl.py文件图书馆,但我无法确定。在

{我可以用它来工作。socket.setdefaulttimeout修改调用后创建的所有套接字的行为,如果套接字被封装在库代码中,这将非常方便。如果您有权访问特定的SSL套接字,则可以使用socket.settimeout。在

相关问题 更多 >