Di dunia pemrograman, efisiensi adalah raja. Salah satu cara paling ampuh untuk membuat aplikasi, terutama yang berhubungan dengan jaringan seperti web scraping atau mengakses API, menjadi super cepat adalah dengan menggunakan pemrograman asynchronous. Bagi pemula di Python, konsep ini mungkin terdengar rumit dan memusingkan. Namun, jangan khawatir. Dengan library yang tepat seperti aiohttp
, belajar asynchronous bisa menjadi pengalaman yang menyenangkan. Artikel ini akan menjadi panduan lengkap untuk memahami dasar-dasar asynchronous di Python dan cara menggunakan aiohttp
untuk melakukan permintaan jaringan tanpa pusing.
Bayangkan Anda harus mengunduh seratus gambar dari internet. Secara tradisional (sinkronus), program Anda akan mengunduh gambar pertama, menunggunya selesai, lalu mengunduh gambar kedua, menunggu lagi, dan begitu seterusnya. Waktu tunggu saat proses unduhan menjadi waktu yang terbuang sia-sia. Pemrograman asynchronous mengubah permainan ini. Ia memungkinkan program Anda untuk memulai unduhan gambar pertama, dan sambil menunggu unduhan itu selesai, ia bisa memulai unduhan gambar kedua, ketiga, dan seterusnya. Dengan cara ini, banyak pekerjaan dapat dilakukan secara bersamaan, memangkas waktu eksekusi secara drastis. Inilah keajaiban yang ditawarkan oleh aiohttp
.
Baca juga: Developer Web Wajib Lirik OnsenUI, Bikin Aplikasi Hybrid Jadi Lebih Seru
Kenapa Harus Asynchronous? Analogi Pesan Kopi
Untuk memahami konsep asynchronous dengan mudah, mari kita gunakan analogi sebuah kedai kopi.
- Cara Sinkronus (Tradisional): Anda datang ke kasir, memesan secangkir latte. Kasir kemudian berhenti melayani pelanggan lain, berjalan ke mesin kopi, membuat latte Anda dari awal sampai akhir, lalu memberikannya kepada Anda. Baru setelah itu, ia akan melayani pelanggan berikutnya. Jika membuat satu latte butuh 5 menit, pelanggan kelima harus menunggu 20 menit hanya untuk bisa memesan. Sangat tidak efisien, bukan? Inilah cara kerja library seperti
requests
di Python. - Cara Asynchronous: Anda datang ke kasir, memesan latte, dan langsung membayar. Kasir memberikan pesanan Anda ke barista dan langsung melayani pelanggan berikutnya. Sementara itu, barista membuat pesanan Anda. Anda bisa duduk manis sambil menunggu nama Anda dipanggil. Kasir tidak terblokir dan bisa terus menerima pesanan lain. Barista pun bisa mengerjakan beberapa pesanan secara paralel. Inilah filosofi di balik asynchronous. Program Anda tidak “terblokir” menunggu satu tugas selesai; ia bisa beralih mengerjakan tugas lain yang sudah siap.
Dalam dunia pemrograman, “menunggu” ini bisa berupa menunggu respons dari sebuah server, membaca file dari hard disk, atau menunggu database mengembalikan data. Semua ini adalah operasi I/O (Input/Output bound), di mana asynchronous akan bersinar paling terang.
Mengenal async
, await
, dan asyncio
Sebelum terjun ke aiohttp
, kita perlu berkenalan dengan tiga pilar utama asynchronous di Python:
asyncio
: Ini adalah library bawaan Python yang menjadi fondasi untuk menjalankan kode asynchronous.asyncio
menyediakan event loop, semacam manajer yang bertugas mengatur dan menjadwalkan tugas-tugas asynchronous mana yang harus dijalankan.async def
: Ini adalah cara kita mendefinisikan sebuah fungsi asynchronous atau yang disebut juga coroutine. Fungsi ini tidak langsung berjalan saat dipanggil, melainkan mengembalikan sebuah objek coroutine yang bisa dijalankan oleh event loop.await
: Kata kunci ini hanya bisa digunakan di dalam fungsiasync def
.await
memberitahu event loop: “Hei, aku akan menjalankan tugas yang butuh waktu tunggu (misalnya, meminta data ke API). Sambil menunggu, silakan kerjakan tugas lain yang sudah siap.” Ketika tugas yang ditunggu selesai, event loop akan kembali dan melanjutkan eksekusi dari titik tersebut.
Kombinasi ketiganya memungkinkan kita menulis kode yang terlihat seperti kode sinkronus biasa, tetapi berjalan dengan cara yang jauh lebih efisien.
Perkenalkan aiohttp
: Si Jagoan Networking Asynchronous
Jika requests
adalah raja library HTTP untuk pemrograman sinkronus, maka aiohttp
adalah rajanya di dunia asynchronous. aiohttp
adalah library yang menyediakan klien HTTP dan juga server web yang dibangun di atas asyncio
. Ia dirancang dari dasar untuk menjadi non-blocking, memungkinkannya menangani ribuan koneksi secara bersamaan dengan sangat efisien.
Dengan aiohttp
, Anda bisa melakukan semua hal yang biasa Anda lakukan dengan requests
, seperti mengirim permintaan GET, POST, PUT, menambahkan header, dan mengelola session, tetapi semuanya dilakukan dengan cara asynchronous. Ini menjadikannya pilihan ideal untuk aplikasi yang melakukan banyak sekali permintaan jaringan, seperti:
- Web Scraper: Mengumpulkan data dari ratusan halaman web secara bersamaan.
- API Client: Berinteraksi dengan banyak microservice atau API eksternal dengan cepat.
- Bot: Membuat bot untuk Telegram, Discord, atau platform lain yang perlu merespons banyak permintaan secara real-time.
Praktik Langsung: Mengirim Request dengan aiohttp
Teori saja tidak cukup, mari kita langsung coba praktik. Pertama, pastikan Anda sudah menginstal aiohttp
.
Bash
pip install aiohttp
Sekarang, mari kita buat program sederhana untuk mengambil data dari JSONPlaceholder, sebuah API publik untuk pengujian.
Python
import asyncio
import aiohttp
async def main():
# Membuat session client dalam blok 'async with'
# Ini memastikan session akan ditutup secara otomatis
async with aiohttp.ClientSession() as session:
# URL API yang akan kita akses
url = 'https://jsonplaceholder.typicode.com/posts/1'
# Mengirim permintaan GET dengan 'await'
# Program akan "berhenti" di sini sambil menunggu server merespons
# tapi event loop bisa mengerjakan tugas lain
async with session.get(url) as response:
# Mencetak status code dari respons
print("Status:", response.status)
# Membaca isi respons sebagai JSON dengan 'await'
data = await response.json()
print("Judul Post:", data['title'])
# Menjalankan fungsi main() menggunakan event loop asyncio
# Di Python 3.7+, cara ini adalah yang paling sederhana
if __name__ == "__main__":
asyncio.run(main())
Mari kita bedah kode di atas:
import asyncio
danimport aiohttp
adalah langkah pertama untuk mengimpor library yang kita butuhkan.- Fungsi
main
kita definisikan denganasync def
, menandakan ini adalah sebuah coroutine. aiohttp.ClientSession()
digunakan untuk membuat sebuah session. Menggunakanasync with
adalah praktik terbaik karena ia akan menangani koneksi dan menutupnya secara otomatis.session.get(url)
adalah cara kita melakukan permintaan GET. Perhatikan penggunaanawait
di depannya (sebenarnya,async with
adalah bentuk lain dariawait
). Ini adalah titik di mana program akan menunggu respons jaringan.response.json()
juga memerlukanawait
karena proses membaca dan mengubah data dari respons juga merupakan operasi I/O yang butuh waktu.- Terakhir,
asyncio.run(main())
adalah cara kita menyuruh Python untuk memulai event loop dan menjalankan coroutinemain
kita sampai selesai.
Meskipun contoh ini hanya mengakses satu URL, bayangkan jika kita ingin mengakses 100 URL. Dengan aiohttp
dan asyncio.gather
, kita bisa menjalankan semua permintaan tersebut secara bersamaan, bukan satu per satu.
Belajar pemrograman asynchronous di Python pada awalnya mungkin terasa seperti belajar cara berpikir yang baru. Namun, dengan memahami analogi sederhananya dan dibantu oleh library modern seperti aiohttp
, prosesnya menjadi jauh lebih mudah. Kunci utamanya adalah mengidentifikasi bagian mana dari program Anda yang melibatkan “menunggu” (operasi I/O) dan mengubahnya menjadi non-blokir menggunakan async
dan await
. Dengan begitu, Anda bisa membuka potensi penuh dari aplikasi Anda untuk menjadi lebih cepat, lebih responsif, dan mampu menangani beban kerja yang jauh lebih besar tanpa pusing.
Penulis: Indra Irawan