Po przekroczeniu limitu czasu , zgłaszany jest wyjątek urllib2.URLError
. Jaki jest podpowiedziowy sposób ponownego nawiązania połączenia?Jak ponowić próbę urllib2.request w przypadku niepowodzenia?
Odpowiedz
Chciałbym użyć dekoratora retry. Są inne, ale ten działa całkiem nieźle. Oto w jaki sposób można go używać:
@retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
return urllib2.urlopen("http://example.com")
To będzie ponowić funkcję jeśli URLError
jest podniesiony. Sprawdź powyższy link, aby uzyskać dokumentację parametrów, ale zasadniczo wznowi to maksymalnie 4-krotnie, z dwukrotnym podwojeniem wykładniczej zwłoki czasowej, np. 3 sekundy, 6 sekund, 12 sekund.
To jest naprawdę fajny fragment. Czy znasz alternatywę, ale jako menedżer kontekstu? –
Hmm, myślę, że prawdopodobnie mógłbyś przepisać go jako kontekstowy menedżer całkiem łatwo, ale nie mam żadnego offhandu. – jterrace
Nie jest to łatwe, ponieważ nie ma łatwego sposobu przechwycenia bloku wewnątrz instrukcji with. Potrzebujesz głębokiej introspekcji. –
Aby ponowić po przekroczeniu tego limitu można złapać wyjątek jako @Karl Barker suggested in the comment:
assert ntries >= 1
for _ in range(ntries):
try:
page = urlopen(request, timeout=timeout)
break # success
except URLError as err:
if not isinstance(err.reason, socket.timeout):
raise # propagate non-timeout errors
else: # all ntries failed
raise err # re-raise the last timeout error
# use page here
Istnieje kilka bibliotek tam, które specjalizują się w tym.
Jedną z nich jest backoff, która została zaprojektowana ze szczególnie funkcjonalną wrażliwością. Dekoratory są przekazywane przez arbitralne generatory zwrotne, które generują kolejne wartości opóźnień. Prosty wykładniczy ograniczania maksymalnej czasu ponawiania 32 sekund, może być zdefiniowane jako:
@backoff.on_exception(backoff.expo,
urllib2.URLError,
max_value=32)
def url_open(url):
return urllib2.urlopen("http://example.com")
Innym jest retrying który ma bardzo podobną funkcjonalność, lecz API, gdzie ponownie parametry są określone za pomocą predefiniowanych argumentach kluczowe.
- 1. jak stworzyć próbę w modelu przypadku testowego
- 2. Jak zaimplementować limit czasu i ponowić próbę dla Restangular
- 3. Wykrywanie przyczyny niepowodzenia otwarcia przepływu w przypadku niepowodzenia() jest prawdziwe
- 4. Twitter - twemproxy - memcached - nie ponowić próbę działa zgodnie z oczekiwaniami
- 5. Ustawianie limitu czasu na wywołanie urllib2.request()
- 6. Pomoc w przypadku niepowodzenia linkera: .gnu.linkonce.t
- 7. Jak zwrócić wartość std :: copy w przypadku sukcesu lub niepowodzenia?
- 8. Jak skonfigurować usługę systemd, aby ponowić próbę 5 razy w cyklu 30 sekund.
- 9. Jak ponowić ładowanie wideo ponownie raz zawiedzie
- 10. Wykonaj domyślne zadanie w ANT w przypadku niepowodzenia.
- 11. Zapobieganie skupianiu się na polu w przypadku niepowodzenia sprawdzania poprawności
- 12. Django: ValueError: nie można przypisać żadnej wartości w polu ForeignField podczas próby utworzenia w przypadku niepowodzenia.
- 13. Jak utworzyć próbę RXJ? Z opóźnieniem i limitem prób
- 14. PHP: Instrukcja "lub" w przypadku niepowodzenia instrukcji: jak wyrzucić nowy wyjątek?
- 15. W jaki sposób D może powrócić 0 w przypadku sukcesu i niezerowej w przypadku niepowodzenia, jeśli główna jest nieważna?
- 16. Jak mogę (najlepiej) przekonwertować opcję na próbę?
- 17. Jak wyłączyć próbę aktualizacji kwarcu?
- 18. Jak przerwać próbę połączenia TSQLConnection w XE2?
- 19. widelec: ponowić: Zasoby chwilowo niedostępne
- 20. HTTP, 408 Request timeout
- 21. Czas oczekiwania na urllib2? - Python
- 22. Gdzie umieścić próbę złapać
- 23. Ponów próbę wykonania komendy Bash z limitem czasu
- 24. Jak cofnąć i ponowić płynną linię w telefonie iPhone?
- 25. Jak wymusić ansibli, aby ponowić zadanie "apt", jeśli się nie powiedzie?
- 26. Pola wejściowe zawierają poprzednie wartości tylko w przypadku niepowodzenia sprawdzania poprawności
- 27. wydrukuj przyczynę niepowodzenia segmentacji
- 28. Python - urllib2 & cookielib
- 29. Jak usunąć próbę naruszenia aplikacji iOS?
- 30. Python - Jak odblokować/zresetować próbę podczas testowania?
To pytanie powinno odpowiedzieć na twoje pytanie: http://stackoverflow.com/questions/2712524/handling-urllib2s-timeout-python –
Nie pytałem, jak złapać wyrok. Chciałem wiedzieć, czy istnieje pythonic sposób, aby spróbować ponownie nawiązać połączenie. – iTayb
Przepraszam, założyłem, że problem polegał na wykryciu limitu czasu, a nie ponownym ustanowieniu połączenia. Czy nie możesz wywołać urlopuen() w bloku wyjątku? –