Próbując uczynić jedną z moich aplikacji Pythona nieco bardziej niezawodną w przypadku przerw w łączeniu odkryłem, że wywołanie funkcji odczytu strumienia http utworzonego przez urllib2 może blokować skrypt na zawsze.czytanie strumienia utworzonego przez urllib2 nigdy się nie odtwarza, gdy połączenie zostało przerwane
Myślałem, że funkcja odczytu będzie działać w określonym czasie i ostatecznie zgłosi wyjątek, ale nie będzie to miało miejsca, gdy połączenie zostanie przerwane podczas wywołania funkcji odczytu.
Oto kod, który spowoduje, że problem:
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"
(Jeśli wypróbować skrypt prawdopodobnie trzeba przerywać połączenia kilka razy, zanim będzie można dotrzeć do stanu, z którego scenariusz nigdy nie odzyskuje)
Obejrzałem skrypt za pośrednictwem Winpdb i zrobiłem zrzut ekranu stanu, z którego skrypt nigdy się nie wyodrębnia (nawet jeśli sieć była ponownie dostępna).
Winpdb http://img10.imageshack.us/img10/6716/urllib2.jpg
Czy istnieje sposób, aby utworzyć skrypt Pythona, który będzie nadal działać, nawet jeśli niezawodne połączenie sieciowe, ale przerwał? (Wolałbym tego uniknąć w dodatkowym wątku).
+1 dla dobrze pisemne pytanie –