Traffine I/O

Bahasa Indonesia

2023-04-01

Retry dengan Tenacity di Python

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:

bash
$ 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:

python
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:

python
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:

python
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:

python
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.

python
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

https://tenacity.readthedocs.io/en/latest/
https://github.com/jd/tenacity

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!