我正在使用urllib2打开下载一些网页。不幸的是,一个页面是一个无限的流(一组实时视频帧),urllib2不会超时,因为打开调用成功,而'read'调用永远挂起。示例代码:
res = opener.open(encoded, timeout=timeout)
log('opened', url)
contents = res.read()
log('never get here')
有关避免/杀死这些连接的任何提示吗?
答案 0 :(得分:3)
这听起来像是发电机的工作!
想象一下,你有一个无限的文本文件...现在调用它test.txt open('test.txt').read()
将挂起机器并最终崩溃,所以为什么不在生成器中的这个无限流中产生线路,例如
def yield_line(file):
with open(file) as inp:
for line in inp:
yield line
现在,当初始化的yield_line成为可迭代对象时,这将成为合法的
out = open('out.txt')
for line in yield_line('test.txt'):
out.write(line.replace('1','2'))
现在考虑一个url可以像文件一样操作,你可以在url中为line输出行
def yield_url(url):
with urllib.urlopen(url) as inp:
for line in inp:
yield line
编辑: 超时示例
out = open('out.txt')
for count, line in enumerate(yield_line('test.txt')):
if count == 444: #timeout value :D
break
out.write(line.replace('1','2'))
答案 1 :(得分:3)
使用雅各布提到的发电机方法我集成了一个“停止开关”。
startime = datetime.now()
res = opener.open(url, timeout=timeout)
contents = ''
for item in res:
contents += item
if (datetime.now() - starttime).seconds > timeout:
raise IOError('timeout')
答案 2 :(得分:2)
您应检查标题以检测它是否为多部分,然后删除或读取内容。
答案 3 :(得分:0)
您可以对整个操作设置超时,即定义您提到的那些行的函数。