Khi urllib2.request
hết thời gian chờ, ngoại lệ urllib2.URLError
được nâng lên. Cách pythonic để thử thiết lập kết nối là gì?Làm thế nào để thử lại urllib2.request khi không thành công?
Trả lời
Tôi sẽ sử dụng trình trang trí retry. Có những cái khác ngoài kia, nhưng cái này hoạt động khá tốt. Dưới đây là cách bạn có thể sử dụng:
@retry(urllib2.URLError, tries=4, delay=3, backoff=2)
def urlopen_with_retry():
return urllib2.urlopen("http://example.com")
Điều này sẽ thử lại chức năng nếu URLError
được nâng lên. Kiểm tra liên kết ở trên để biết tài liệu về các tham số, nhưng về cơ bản, nó sẽ thử lại tối đa 4 lần, với trễ trễ theo hàm mũ tăng gấp đôi mỗi lần, ví dụ: 3 giây, 6 giây, 12 giây.
Đây là đoạn trích thực sự thú vị. Bạn có biết một sự thay thế, nhưng là một người quản lý ngữ cảnh? –
Hmm, tôi nghĩ bạn có lẽ có thể viết lại nó như một người quản lý ngữ cảnh khá dễ dàng, nhưng tôi không có một tay. – jterrace
Nó không dễ dàng để làm, vì không có cách dễ dàng để nắm bắt các khối bên trong với tuyên bố. Bạn cần một số nội tâm sâu sắc. –
Để thử lại vào thời gian chờ bạn có thể nắm bắt những ngoại lệ như @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
Có một vài thư viện ra khỏi đó mà chuyên này.
Một là backoff, được thiết kế với độ nhạy đặc biệt chức năng. Trang trí được thông qua tùy ý gọi trở về máy phát điện mà mang lại giá trị chậm trễ liên tiếp. Một backoff mũ đơn giản với một thời gian retry tối đa 32 giây có thể được định nghĩa là:
@backoff.on_exception(backoff.expo,
urllib2.URLError,
max_value=32)
def url_open(url):
return urllib2.urlopen("http://example.com")
khác là retrying có chức năng rất giống nhau nhưng một API nơi thử lại các thông số được quy định bằng cách args từ khóa được xác định trước.
- 1. urllib2 Lỗi HTTP 400: Bad Request
- 2. Làm thế nào để lấy Request Payload
- 3. Paymill: Làm cách nào để mô phỏng thanh toán không thành công trong khi thử nghiệm?
- 4. Xây dựng bộ thử nghiệm không thành công - (android.test.suitebuilder.TestSuiteBuilder $ FailedToCreateTests). Làm thế nào để giải quyết?
- 5. Tự động tải lại thư còn lại trong svn-commit.tmp khi thử lại một cam kết không thành công?
- 6. urllib2.Request (<url>) làm gì và cách in/xem nó
- 7. Thử lại khung công tác
- 8. Làm thế nào để xóa xác thực không thành công trong hộp thoại khi mở lại hộp thoại
- 9. Làm thế nào để xử lý realloc khi nó không thành công do bộ nhớ?
- 10. Tôi cần xử lý lỗi nào/ngoại lệ với urllib2.Request/urlopen?
- 11. Tự động khởi động lại trường hợp thử nghiệm không thành công trong TestNG/Selenium
- 12. Làm thế nào để chuyển đổi HTTP Request Body thành JSON Object trong Java
- 13. Làm thế nào để làm cho odeint thành công?
- 14. Làm mới jQuery/Tải lại trang sau khi thành công
- 15. Làm thế nào để chạy "gói" trước khi thử nghiệm "
- 16. Làm thế nào để chỉ hiển thị stdout của một thử nghiệm scalatest nếu nó không thành công
- 17. Làm thế nào để làm cho cần tây thử lại bằng cách sử dụng cùng một công nhân?
- 18. Mẫu điền lại khi xác thực không thành công
- 19. PHPUnit - Tự động thử lại các lần kiểm tra không thành công X lần?
- 20. Làm thế nào để biết nếu urllib.urlretrieve thành công?
- 21. HttpPost không thành công do "Không thể thử yêu cầu với thực thể yêu cầu không lặp lại"
- 22. Chạy lại các thử nghiệm không thành công và không chạy
- 23. Làm thế nào để mô phỏng nút quay lại khi thử nghiệm các ứng dụng Ember.js?
- 24. Làm thế nào để tăng tốc độ urllib2 của Python khi thực hiện nhiều yêu cầu
- 25. làm cách nào tôi có thể kích hoạt gọi lại lỗi ajax khi gọi lại thành công?
- 26. Chạy lại thử nghiệm không thành công cuối cùng trong PHPUnit
- 27. Cách phát hiện lỗi tải hình ảnh và nếu không thành công, hãy thử tải lại cho đến khi thành công?
- 28. Làm thế nào để bạn thử nghiệm?
- 29. writeToFile không thành công - làm cách nào để gỡ lỗi WHY không thành công (công cụ nào)?
- 30. Nhận URL khi xử lý urllib2.URLError
Câu hỏi này phải trả lời câu hỏi của bạn: http://stackoverflow.com/questions/2712524/handling-urllib2s-timeout-python –
Tôi không hỏi làm cách nào để nắm bắt được yêu cầu. Tôi muốn biết nếu có một cách pythonic để thử lại thiết lập kết nối. – iTayb
Xin lỗi, tôi cho rằng vấn đề là phát hiện thời gian chờ đã đạt được, không phải là tái hợp nhất kết nối. Bạn không thể gọi urlopen() trong khối ngoại lệ? –