قراءة دفق التي urllib2 لم يتعافى عندما حصلت على اتصال توقف
سؤال
وبينما كان يحاول أن يجعل واحدة من التطبيقات الخاصة بي الثعبان قليلا أكثر قوة في حالة انقطاع الاتصال اكتشفت أن استدعاء الدالة قراءة من 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