8

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

我认为读取函数将超时并最终引发异常,但是当连接在读取函数调用期间中断时,情况并非如此。

以下是会导致问题的代码:

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脚本?(我宁愿避免在额外的线程中这样做。)

4

2 回答 2

7

尝试类似:

import socket
socket.setdefaulttimeout(5.0)
   ...
try:
   ...
except socket.timeout:
   (it timed out, retry)
于 2009-05-01T14:57:26.103 回答
2

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

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
于 2009-05-01T14:32:14.243 回答