urlopen随机冻结,timout被忽略

2024-05-01 01:15:42 发布

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

我有一个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 setHow can I force urllib2 to time out?Timing out urllib2 urlopen operation in Python 2.4Timeout 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接受浮动。在


Tags: to方法noneapi时间timeouturllib2curl
1条回答
网友
1楼 · 发布于 2024-05-01 01:15:42

查看源代码,timeout值实际上是Python从远程主机接收数据包之间等待的最长时间。在

因此,如果您将超时设置为两秒,并且远程主机以每秒一个数据包的速率发送60个数据包,则不会发生超时,尽管整个过程仍需要60秒。在

由于urlopen()函数在远程主机发送完所有HTTP报头后才会返回,因此如果它发送报头的速度非常慢,那么您对此无能为力。在

如果你需要一个完整的HTTP/O,你可能需要一个非HTTP/O的限制

相关问题 更多 >