Python urllib2.urlopen freezes script infinitely even though timeout is set
函数
-
为什么即使设置了超时,
urlopen 也会冻结我的脚本? - 我怎样才能访问URL上的数据(在这种情况下:http://api.own3d.tv/live?channel = .FnaticTV),而我的Python进程可能永远不会冻结?
这是冻结的部分(在own3d.py中):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Try three times to make contact while True: try: # Connect to API # Right here! It freezes here connection = urllib2.urlopen(request, timeout=10) xmlstring = connection.read() except URLError as e: tries += 1 if tries >= 3: sys.stderr.write( 'own3dStreamsUpdater: Fatal error: Repeated timeouts') exit() |
这是我的KeyboardInterrupt之后的堆栈跟踪
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | Traceback (most recent call last): File"", line 1, in File"honsapp/own3dStreamsUpdater.py", line 53, in updateStreamInfo streamInfo = getStreamInfo(stream) File"honsapp/own3d.py", line 98, in getStreamInfo connection = urllib2.urlopen(request, timeout=10) File"/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File"/usr/local/lib/python2.7/urllib2.py", line 394, in open response = self._open(req, data) File"/usr/local/lib/python2.7/urllib2.py", line 412, in _open '_open', req) File"/usr/local/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File"/usr/local/lib/python2.7/urllib2.py", line 1199, in http_open return self.do_open(httplib.HTTPConnection, req) File"/usr/local/lib/python2.7/urllib2.py", line 1170, in do_open r = h.getresponse(buffering=True) File"/usr/local/lib/python2.7/httplib.py", line 1027, in getresponse response.begin() File"/usr/local/lib/python2.7/httplib.py", line 407, in begin version, status, reason = self._read_status() File"/usr/local/lib/python2.7/httplib.py", line 365, in _read_status line = self.fp.readline() File"/usr/local/lib/python2.7/socket.py", line 447, in readline data = self._sock.recv(self._rbufsize) KeyboardInterrupt |
编辑
我让我的剧本过夜了。 我不知道它花了多长时间(虽然超过五分钟),但剧本终于放弃并给了我一个堆栈跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Traceback (most recent call last): File"honsapp/own3dStreamsUpdater.py", line 260, in newInfo() File"honsapp/own3dStreamsUpdater.py", line 172, in newInfo result = updateStreamInfo(stream) File"honsapp/own3dStreamsUpdater.py", line 53, in updateStreamInfo streamInfo = getStreamInfo(stream) File"/root/Dropbox/Projects/honstreams/honsapp/own3d.py", line 98, in getStreamInfo connection = urllib2.urlopen(request, timeout=10) File"/usr/local/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File"/usr/local/lib/python2.7/urllib2.py", line 394, in open response = self._open(req, data) File"/usr/local/lib/python2.7/urllib2.py", line 412, in _open '_open', req) File"/usr/local/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File"/usr/local/lib/python2.7/urllib2.py", line 1199, in http_open return self.do_open(httplib.HTTPConnection, req) File"/usr/local/lib/python2.7/urllib2.py", line 1170, in do_open r = h.getresponse(buffering=True) File"/usr/local/lib/python2.7/httplib.py", line 1027, in getresponse response.begin() File"/usr/local/lib/python2.7/httplib.py", line 407, in begin version, status, reason = self._read_status() File"/usr/local/lib/python2.7/httplib.py", line 371, in _read_status raise BadStatusLine(line) httplib.BadStatusLine: '' |
这个脚本根本不会冻结,但它是一个很好的例子,说明为什么你不应该在疲倦时编码。 应该尝试连接到API三次的循环将永远持续,因为我忘了在那里放一个
这个问题是如此愚蠢,我不会责怪你删除它。
固定代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Try three times to make contact while True: try: # Connect to API connection = urllib2.urlopen(request, timeout=10) xmlstring = connection.read() break except URLError as e: tries += 1 if tries >= 3: sys.stderr.write( 'own3dStreamsUpdater: Fatal error: Repeated timeouts') exit() |
你确定urlopen()调用挂起了吗? 因为如果调用成功,你的while循环不会终止。