Urllib2에 의해 만들어진 스트림 읽기 연결이 중단되었을 때 절대 복구되지 않습니다.

StackOverflow https://stackoverflow.com/questions/811446

  •  03-07-2019
  •  | 
  •  

문제

연결 중단의 경우 파이썬 응용 프로그램 중 하나를 조금 더 강력하게 만들려고하는 동안 Urllib2가 만든 HTTP- 스트림의 읽기 기능을 호출하면 스크립트를 영원히 차단할 수 있음을 발견했습니다.

읽기 기능이 타임 아웃되어 결국 예외가 발생한다고 생각했지만 읽기 기능 호출 중에 연결이 중단 될 때 이음새가 아닙니다.

다음은 문제를 일으킬 코드입니다.

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

네트워크 연결이 중단 되더라도 계속 신뢰할 수있는 파이썬 스크립트를 만들 수있는 방법이 있습니까? (추가 스레드 안에서이 작업을 피하는 것을 선호합니다.)

도움이 되었습니까?

해결책

다음과 같은 것을 시도하십시오.

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

다른 팁

좋은 질문, 나는 답을 찾는 데 정말로 관심이있을 것입니다. 내가 생각할 수있는 유일한 해결 방법은 파이썬 문서. 귀하의 경우에는 다음과 같습니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top