当连接中断时,读取urllib2创建的流永远不会恢复

时间:2009-05-01 13:51:53

标签: python urllib2

在尝试使我的一个python应用程序在连接中断的情况下更加健壮时,我发现调用urllib2创建的http-stream的read函数可能会永远阻止脚本。

我认为read函数会超时并最终引发一个异常,但是当读取函数调用期间连接被中断时,这种情况并不接近。

以下是导致问题的代码:

import urllib2

while True:
    try:
        stream = urllib2.urlopen('http://www.google.de/images/nav_logo4.png')
        while stream.read(): pass
        print "Done"
    except:
        print "Error"

(如果您尝试使用该脚本,您可能需要多次中断连接才能达到脚本永远无法恢复的状态)

我通过Winpdb观看了脚本,并制作了脚本永远无法恢复的状态的屏幕截图(即使网络再次可用)。

Winpdb http://img10.imageshack.us/img10/6716/urllib2.jpg

有没有办法创建一个即使网络连接中断也能继续可靠运行的python脚本? (我宁愿避免在一个额外的线程中这样做。)

2 个答案:

答案 0 :(得分:7)

尝试类似:

import socket
socket.setdefaulttimeout(5.0)
   ...
try:
   ...
except socket.timeout:
   (it timed out, retry)

答案 1 :(得分:2)

好问题,我真的很想找到答案。我能想到的唯一解决方法是使用python docs中解释的信号技巧。 在你的情况下,它将更像是:

import signal
import urllib2

def read(url):
    stream = urllib2.urlopen(url)
    return stream.read()

def handler(signum, frame):
    raise IOError("The page is taking too long to read")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This read() may hang indefinitely
try:
    output = read('http://www.google.de/images/nav_logo4.png')
except IOError:
    # try to read again or print an error
    pass

signal.alarm(0)          # Disable the alarm