Alternatif untuk retrying
: tenacity
dan backoff
(pembaruan 2020)
The mencoba kembali perpustakaan sebelumnya cara untuk pergi, tapi sayangnya memiliki beberapa bug dan belum mendapatkan update sejak 2016. alternatif lain tampaknya backoff dan keuletan . Selama penulisan ini, keuletan memiliki lebih banyak bintang GItHub (2.3k vs 1.2k) dan diperbarui baru-baru ini, oleh karena itu saya memilih untuk menggunakannya. Berikut ini sebuah contoh:
from functools import partial
import random # producing random errors for this example
from tenacity import retry, stop_after_delay, wait_fixed, retry_if_exception_type
# Custom error type for this example
class CommunicationError(Exception):
pass
# Define shorthand decorator for the used settings.
retry_on_communication_error = partial(
retry,
stop=stop_after_delay(10), # max. 10 seconds wait.
wait=wait_fixed(0.4), # wait 400ms
retry=retry_if_exception_type(CommunicationError),
)()
@retry_on_communication_error
def do_something_unreliable(i):
if random.randint(1, 5) == 3:
print('Run#', i, 'Error occured. Retrying.')
raise CommunicationError()
Kode di atas menghasilkan sesuatu seperti:
Run# 3 Error occured. Retrying.
Run# 5 Error occured. Retrying.
Run# 6 Error occured. Retrying.
Run# 6 Error occured. Retrying.
Run# 10 Error occured. Retrying.
.
.
.
Lebih banyak pengaturan untuk tenacity.retry
terdaftar di halaman GitHub tenacity .
range(100)
tanpa parameter pertama. Jika Anda menggunakan Python 2.x yang bahkan bisa Anda gunakanxrange(100)
, ini menghasilkan iterator dan menggunakan lebih sedikit memori. (Bukan berarti itu penting hanya dengan 100 objek.)