Retry dengan Tenacity
Di dunia pengembangan perangkat lunak, seringkali kita mengalami situasi di mana sebuah kode harus diulang beberapa kali karena kegagalan sementara atau masalah di luar kendali kita. Hal ini bisa termasuk kesalahan jaringan, waktu habis server, atau batasan tingkat API. Untuk mengatasi tantangan ini, para pengembang Python dapat menggunakan pustaka Tenacity yang kuat dan fleksibel.
Tenacity adalah pustaka yang banyak digunakan dan dijaga dengan baik yang menyederhanakan proses menambahkan logika pengulangan pada aplikasi Python. Pustaka ini menyediakan API yang mudah digunakan, memungkinkan para pengembang untuk menerapkan pengulangan dengan usaha minimal dan penyesuaian maksimum. Dalam artikel ini, saya akan menjelajahi banyak fitur dari Tenacity, dari penggunaan dasar hingga strategi yang lebih canggih, dan menunjukkan bagaimana menggunakannya dengan efektif dalam berbagai skenario.
Instalasi Tenacity
Sebelum membahas fitur-fitur dari Tenacity, kita perlu menginstal pustaka tersebut. Anda dapat menginstal Tenacity menggunakan pip, manajer paket Python, dengan perintah berikut:
$ pip install tenacity
Penggunaan Dasar Tenacity
Pengulangan Sederhana
Untuk mulai menggunakan Tenacity, impor decorator retry
dari modul tenacity
dan terapkan pada fungsi yang ingin diulang. Contohnya:
from tenacity import retry
@retry
def fetch_data():
# Code to fetch data from a remote server
Secara default, Tenacity akan mengulangi fungsi tersebut tanpa batas dengan jeda 1 detik antara setiap upaya hingga berhasil.
Menyesuaikan Logika Pengulangan
Tenacity memungkinkan Anda untuk menyesuaikan perilaku pengulangan menggunakan berbagai opsi. Misalnya, Anda dapat menentukan jumlah pengulangan, waktu jeda antara setiap upaya, dan kondisi di mana pengulangan harus terjadi. Berikut adalah contoh fungsi yang mengulang hingga 5 kali dengan jeda 2 detik antara setiap upaya:
from tenacity import retry, stop_after_attempt, wait_fixed
@retry(stop=stop_after_attempt(5), wait=wait_fixed(2))
def fetch_data():
# Code to fetch data from a remote server
Menangani Pengecualian dengan Tenacity
Ketika bekerja dengan pengulangan, penting untuk menangani pengecualian dengan efektif. Dalam bagian ini, saya akan menjelajahi kemampuan penanganan pengecualian Tenacity, termasuk bagaimana merenungkan pengecualian dan membuat penangan pengecualian khusus.
Merenungkan Pengecualian
Secara default, Tenacity menekan pengecualian yang terjadi selama pengulangan. Perilaku ini dapat menjadi masalah jika Anda perlu mengetahui kapan pengecualian terjadi, bahkan setelah semua pengulangan telah habis. Untuk mengonfigurasi Tenacity agar merenungkan kembali pengecualian terakhir setelah semua pengulangan telah dicoba, Anda dapat menggunakan opsi reraise=True
:
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3), reraise=True)
def fetch_data():
# Code to fetch data from a remote server
Sekarang, jika fungsi fetch_data
terus gagal setelah tiga upaya, Tenacity akan merenungkan kembali pengecualian terakhir, memungkinkan Anda untuk menanganinya dengan tepat dalam aplikasi Anda.
Penanganan Pengecualian Khusus
Kadang-kadang, Anda mungkin ingin melakukan tindakan tertentu saat terjadi pengecualian, seperti mencatat kesalahan atau mengeksekusi fungsi cadangan. Tenacity menyediakan mekanisme pemanggilan balik yang disebut retry_error_callback
yang memungkinkan Anda menentukan logika penanganan pengecualian khusus.
Berikut adalah contoh callback error khusus yang mencatat pengecualian dan mengembalikan nilai default:
from tenacity import retry, stop_after_attempt
def error_callback(retry_state):
print(f"An error occurred: {retry_state.outcome.exception()}")
return "default_value"
@retry(stop=stop_after_attempt(3), retry_error_callback=error_callback)
def fetch_data():
# Code to fetch data from a remote server
Dalam contoh ini, jika fungsi fetch_data
terus gagal setelah tiga upaya, fungsi error_callback
akan dipanggil. Fungsi ini mencatat pengecualian dan mengembalikan nilai default, yang akan menjadi hasil dari fungsi fetch_data
.
Perlu diingat bahwa ketika menggunakan retry_error_callback
, Tenacity tidak akan merenungkan kembali pengecualian. Jika Anda ingin menangani pengecualian dan merenungkan kembali, Anda dapat melakukannya di dalam callback error.
def error_callback(retry_state):
print(f"An error occurred: {retry_state.outcome.exception()}")
raise retry_state.outcome.exception()
@retry(stop=stop_after_attempt(3), retry_error_callback=error_callback)
def fetch_data():
# Code to fetch data from a remote server
Referensi