[文档]classRetry:"""Retry a specific number of times after a failure"""def__init__(self,backoff:"AbstractBackoff",retries:int,supported_errors:Tuple[Type[Exception],...]=(ConnectionError,TimeoutError,socket.timeout,),):""" Initialize a `Retry` object with a `Backoff` object that retries a maximum of `retries` times. `retries` can be negative to retry forever. You can specify the types of supported errors which trigger a retry with the `supported_errors` parameter. """self._backoff=backoffself._retries=retriesself._supported_errors=supported_errors
[文档]defupdate_supported_errors(self,specified_errors:Iterable[Type[Exception]])->None:""" Updates the supported errors with the specified error types """self._supported_errors=tuple(set(self._supported_errors+tuple(specified_errors)))
[文档]defcall_with_retry(self,do:Callable[[],T],fail:Callable[[Exception],Any],)->T:""" Execute an operation that might fail and returns its result, or raise the exception that was thrown depending on the `Backoff` object. `do`: the operation to call. Expects no argument. `fail`: the failure handler, expects the last error that was thrown """self._backoff.reset()failures=0whileTrue:try:returndo()exceptself._supported_errorsaserror:failures+=1fail(error)ifself._retries>=0andfailures>self._retries:raiseerrorbackoff=self._backoff.compute(failures)ifbackoff>0:sleep(backoff)