قراءة دفق التي urllib2 لم يتعافى عندما حصلت على اتصال توقف

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

  •  03-07-2019
  •  | 
  •  

سؤال

وبينما كان يحاول أن يجعل واحدة من التطبيقات الخاصة بي الثعبان قليلا أكثر قوة في حالة انقطاع الاتصال اكتشفت أن استدعاء الدالة قراءة من HTTP تيار التي urllib2 قد منع النصي إلى الأبد.

وأعتقد أن وظيفة القراءة سوف مهلة، وفي نهاية المطاف رفع استثناء ولكن هذا لا التماس ليكون هذا هو الحال عندما حصلت على الاتصال انقطع أثناء المكالمة وظيفة القراءة.

وهنا هو رمز من شأنها أن تتسبب في حدوث المشكلة:

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

هل هناك طريقة لإنشاء برنامج نصي الثعبان الذي سنواصل العمل موثوق بها حتى إذا كان اتصال الشبكة حصلت على انقطاع؟ (I يفضل تجنب القيام بذلك داخل موضوع إضافي).

هل كانت مفيدة؟

المحلول

وجرب شيئا مثل:

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