Library asyncio Python , yang diperkenalkan pada 2012 untuk membawa pemrograman asinkron ke bahasa ini, menghadapi kritik yang semakin meningkat dari para developer yang berpendapat bahwa library ini memiliki terlalu banyak cacat desain dan masalah kegunaan. Library ini dimaksudkan untuk menyediakan alternatif dari threading tradisional untuk pemrograman konkuren, namun diskusi komunitas mengungkap frustrasi yang meluas terhadap implementasinya.
Mekanisme Pembatalan yang Rusak Menciptakan Masalah bagi Developer
Salah satu masalah paling signifikan dengan asyncio adalah sistem pembatalannya. Tidak seperti threading tradisional di mana pembatalan secara inheren sulit, asyncio seharusnya membuat hal ini lebih mudah. Namun, para developer melaporkan bahwa mekanisme pembatalan ini secara fundamental rusak. Ketika sebuah task dibatalkan, sinyal pembatalan dapat menghilang secara tak terduga, meninggalkan operasi berjalan tanpa batas waktu bahkan setelah seharusnya dihentikan. Hal ini menciptakan situasi di mana aplikasi hang atau mengonsumsi resource secara tidak perlu, membuat sangat sulit untuk membangun aplikasi yang robust yang dapat menangani interupsi dengan baik.
Masalah Manajemen Memori Mengarah pada Error Misterius
Titik masalah utama lainnya adalah pesan error yang terkenal yaitu Task was destroyed but it is pending . Hal ini terjadi karena asyncio tidak menyimpan referensi kuat ke task, yang dapat menyebabkan task dikumpulkan oleh garbage collector saat masih berjalan. Developer sering mengalami error yang membingungkan ini tanpa panduan yang jelas tentang cara memperbaikinya. Akar penyebabnya terletak pada sistem referensi lemah asyncio , yang dirancang untuk mencegah kebocoran memori tetapi justru menciptakan perilaku yang tidak dapat diprediksi dan sulit di-debug.
Kompleksitas API Level Rendah Membuat Developer Frustrasi
API socket dan networking yang mendasari asyncio dikritik karena terlalu kompleks dan penuh dengan jebakan. Operasi sederhana yang seharusnya mudah memerlukan developer untuk memahami detail rumit tentang event loop dan file descriptor. Kompleksitas ini membuat sulit bagi developer untuk menulis kode jaringan yang andal tanpa pengetahuan mendalam tentang internal asyncio .
Masalah Utama asyncio yang Diidentifikasi oleh Komunitas
Masalah | Deskripsi | Dampak |
---|---|---|
Pembatalan yang Rusak | Sinyal pembatalan dapat menghilang, meninggalkan tugas berjalan tanpa batas | Aplikasi hang atau mengonsumsi sumber daya yang tidak perlu |
Error Penghancuran Task | "Task was destroyed but it is pending" karena weak references | Pesan error yang membingungkan dan perilaku yang tidak dapat diprediksi |
API Level Rendah yang Kompleks | Socket dan API jaringan memerlukan pengetahuan mendalam tentang internal | Sulit menulis kode jaringan yang andal |
Masalah Implementasi Queue | Penanganan pola producer-consumer yang buruk | Race condition dan aplikasi yang hang |
Implementasi Queue Menambah Komplikasi yang Tidak Perlu
Bahkan pola dasar seperti hubungan producer-consumer menggunakan Queue asyncio bermasalah. Implementasi queue tidak menangani skenario umum dengan baik, seperti memberi sinyal dengan benar ketika tidak ada lagi item yang akan diproduksi. Hal ini menyebabkan race condition dan aplikasi yang hang, memaksa developer untuk mengimplementasikan workaround yang kompleks untuk pola komunikasi yang seharusnya sederhana.
Komunitas Mencari Alternatif yang Lebih Baik
Komunitas Python secara aktif mendiskusikan alternatif untuk pendekatan asyncio . Beberapa developer mengadvokasi solusi monkey-patching gevent , yang memungkinkan kode yang sama bekerja dalam konteks sinkron dan asinkron. Yang lain menunjuk ke bahasa seperti Go , yang menangani konkurensi tanpa masalah function coloring yang mengganggu asyncio .
Saya benar-benar berharap komunitas telah bersatu di sekitar gevent - tanpa async/await, sebaliknya setiap hal yang mungkin dapat memblokir di standard library di-monkey-patch untuk yield ke event loop.
Diskusi ini juga menyentuh kekhawatiran yang lebih luas tentang evolusi Python . Banyak developer merasa bahwa Python telah menjadi bloated dengan fitur-fitur seperti asyncio , type hints, dan pattern matching yang ditambahkan untuk mengikuti bahasa lain tetapi tidak terintegrasi dengan baik dengan filosofi inti Python .
Alternatif yang Disarankan Komunitas
- gevent: Pendekatan monkey-patching yang memungkinkan kode yang sama untuk sync/async
- anyio: Lapisan antarmuka di atas asyncio untuk memperbaiki kekurangan
- Konkurensi gaya Go: Bahasa tanpa masalah "function coloring"
- Stackful coroutines: Mirip dengan implementasi Lua alih-alih stackless
Jalan ke Depan Masih Tidak Jelas
Sementara library seperti anyio berusaha menyediakan interface yang lebih baik di atas asyncio , masalah desain fundamental tetap ada. Beberapa anggota komunitas menyarankan bahwa Python memerlukan upgrade versi mayor untuk mengatasi masalah ini dengan benar, mirip dengan bagaimana transisi Python 2 ke 3 memungkinkan perubahan yang breaking. Namun, kompleksitas dari upaya tersebut dan pelajaran yang dipetik dari migrasi yang sulit itu membuatnya tidak mungkin terjadi dalam waktu dekat.
Situasi asyncio menyoroti tantangan yang lebih luas dalam desain bahasa: bagaimana menambahkan fitur modern tanpa mengorbankan kesederhanaan dan keanggunan yang membuat bahasa tersebut populer sejak awal. Untuk saat ini, developer Python harus bekerja mengatasi keterbatasan asyncio atau mempertimbangkan pendekatan alternatif untuk pemrograman konkuren.