我有一个API管理器,它连接到一个URL并获取一些json。很简单。 从方法中剪切:
req = Request(url)
socket.setdefaulttimeout(timeout)
resp = urlopen(req, None, timeout)
data = resp.read()
resp.close()
它在大多数时间内都能正常工作,但在随机的时间间隔内,它需要5秒才能完成请求。即使超时设置为0.5或1.0或其他值。 我已经非常仔细地记录了它,所以我100%确定需要时间的行是数字3(即resp=urlopen(req,None,timeout))。在
我尝试了所有关于超时装饰器和计时器等的解决方案。 (列出其中一些: Python urllib2.urlopen freezes script infinitely even though timeout is set, How can I force urllib2 to time out?,Timing out urllib2 urlopen operation in Python 2.4,Timeout function if it takes too long to finish )在
但什么都不管用。我的印象是,当urlopen执行某些操作时,线程会冻结,当它完成时,它就会解冻,然后所有的计时器和超时都会返回w个超时错误。但执行时间仍然超过5秒
我发现了this个关于urllib2和分块编码处理的旧邮件列表。因此,如果问题仍然存在,那么解决方案可能是基于httplib.HTTP而不是httplib.HTTPConnection. 另一个可能的解决方案是尝试一些多线程魔术。。。。在
这两种解决方案似乎都具有侵略性。让我恼火的是,超时并不是一直有效的。在
脚本的执行时间不超过0.5s是非常重要的。有谁知道我为什么会遇到冻结,或者有什么方法可以帮我吗?在
根据接受的答案更新: 我改变了方法,改用curl。加上unix超时,它就像我想要的那样工作。示例代码如下:
^{pr2}$因为curl只接受int作为超时,所以我添加了timeout。timeout接受浮动。在
查看源代码,
timeout
值实际上是Python从远程主机接收数据包之间等待的最长时间。在因此,如果您将超时设置为两秒,并且远程主机以每秒一个数据包的速率发送60个数据包,则不会发生超时,尽管整个过程仍需要60秒。在
由于
urlopen()
函数在远程主机发送完所有HTTP报头后才会返回,因此如果它发送报头的速度非常慢,那么您对此无能为力。在如果你需要一个完整的HTTP/O,你可能需要一个非HTTP/O的限制
相关问题 更多 >
编程相关推荐