Lewati ke konten utama

Asyncio: Sebuah Pengantar

Pengantar singkat tentang I/O asinkron dengan paket asyncio.
Diperbarui 28 Sep 2026  · 12 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Modul asyncio ditambahkan ke Python pada versi 3.4 sebagai paket sementara. Artinya, ada kemungkinan asyncio menerima perubahan yang tidak kompatibel ke belakang atau bahkan dihapus pada rilis Python di masa mendatang.

Menurut dokumentasinya, asyncio “menyediakan infrastruktur untuk menulis kode konkurensi single-thread menggunakan coroutine, melakukan multiplexing akses I/O melalui soket dan sumber daya lain, menjalankan klien dan server jaringan, serta primitif terkait lainnya”. Bab ini tidak dimaksudkan untuk membahas semua yang dapat Anda lakukan dengan asyncio, namun Anda akan mempelajari cara menggunakan modul ini dan mengapa modul ini berguna.

Jika Anda memerlukan sesuatu seperti asyncio pada versi Python yang lebih lama, Anda bisa melihat Twisted atau gevent.

Definisi

Modul asyncio menyediakan kerangka kerja yang berpusat pada event loop. Event loop pada dasarnya menunggu sesuatu terjadi lalu bertindak terhadap peristiwa tersebut. Ia bertanggung jawab menangani hal-hal seperti I/O dan event sistem.

asyncio sebenarnya memiliki beberapa implementasi loop yang tersedia. Modul ini akan menggunakan default yang paling efisien untuk sistem operasi tempat ia dijalankan; namun Anda juga dapat memilih event loop secara eksplisit jika diinginkan. Event loop pada dasarnya mengatakan “ketika peristiwa A terjadi, tanggapi dengan fungsi B”.

Bayangkan sebuah server yang menunggu seseorang datang dan meminta suatu sumber daya, seperti laman web. Jika situs webnya tidak terlalu populer, server akan menganggur cukup lama. Tetapi ketika ada permintaan, server perlu bereaksi. Reaksi ini dikenal sebagai penanganan peristiwa (event handling). Saat pengguna memuat laman web, server akan memeriksa dan memanggil satu atau lebih event handler. Setelah event handler selesai, mereka perlu mengembalikan kendali ke event loop. Untuk melakukan ini di Python, asyncio menggunakan coroutine.

Coroutine adalah fungsi khusus yang dapat menyerahkan kendali ke pemanggilnya tanpa kehilangan state-nya. Coroutine adalah konsumen dan perpanjangan dari generator. Salah satu keuntungan besar dibanding thread adalah coroutine tidak banyak menggunakan memori saat dieksekusi. Perhatikan bahwa ketika Anda memanggil fungsi coroutine, fungsinya tidak langsung dieksekusi. Alih-alih, ia akan mengembalikan objek coroutine yang dapat Anda teruskan ke event loop untuk dijalankan segera atau nanti.

Satu istilah lain yang mungkin akan Anda temui saat menggunakan modul asyncio adalah future. Future pada dasarnya adalah objek yang merepresentasikan hasil dari pekerjaan yang belum selesai. Event loop Anda dapat memantau objek future dan menunggu hingga selesai. Ketika future selesai, statusnya menjadi done. Asyncio juga mendukung lock dan semaphore.

Bagian terakhir yang ingin saya sebutkan adalah Task. Task adalah pembungkus untuk coroutine dan subkelas dari Future. Anda bahkan dapat menjadwalkan Task menggunakan event loop.

async dan await

Kata kunci async dan await ditambahkan di Python 3.5 untuk mendefinisikan coroutine native dan menjadikannya tipe yang berbeda dibanding coroutine berbasis generator. Jika Anda menginginkan penjelasan mendalam tentang async dan await, silakan baca PEP 492.

Pada Python 3.4, Anda akan membuat coroutine seperti ini:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgUHl0aG9uIDMuNCBjb3JvdXRpbmUgZXhhbXBsZVxuIyBJbXBvcnQgYGFzeW5jaW9gXG5pbXBvcnQgX19fX19fX1xuIFxuQGFzeW5jaW8uY29yb3V0aW5lXG5kZWYgbXlfY29ybygpOlxuICAgIHlpZWxkIGZyb20gZnVuYygpIiwic29sdXRpb24iOiIjIFB5dGhvbiAzLjQgY29yb3V0aW5lIGV4YW1wbGVcbmltcG9ydCBhc3luY2lvXG4gXG5AYXN5bmNpby5jb3JvdXRpbmVcbmRlZiBteV9jb3JvKCk6XG4gICAgeWllbGQgZnJvbSBmdW5jKCkiLCJzY3QiOiJFeCgpLnRlc3RfaW1wb3J0KFwiYXN5bmNpb1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJAYXN5bmNpby5jb3JvdXRpbmVcIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBhZGQgYEBhc3luY2lvLmNvcm91dGluZWAgdG8gdGhlIGNvZGU/XCIpXG5FeCgpLnRlc3RfZnVuY3Rpb25fZGVmaW5pdGlvbihcIm15X2Nvcm9cIilcbnN1Y2Nlc3NfbXNnKFwiWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBjb3JvdXRpbmUgaW4gUHl0aG9uIDMuNCEgQnV0IHdoYXQgYWJvdXQgbWFraW5nIHRoaXMgY29yb3V0aW5lIGluIFB5dGhvbiAzLjU/XCIpIn0=

Decorator ini masih berfungsi di Python 3.5, tetapi modul types menerima pembaruan berupa coroutine function yang kini dapat memberi tahu apakah yang Anda gunakan adalah coroutine native atau bukan. Mulai Python 3.5, Anda dapat menggunakan async def untuk secara sintaktis mendefinisikan fungsi coroutine.

Jadi fungsi di atas akan terlihat seperti ini:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImltcG9ydCBfX19fX19fXG4gXG5hc3luYyBkZWYgX19fX19fXygpOlxuICAgIGF3YWl0IGZ1bmMoKSIsInNvbHV0aW9uIjoiaW1wb3J0IGFzeW5jaW9cbiBcbmFzeW5jIGRlZiBteV9jb3JvKCk6XG4gICAgYXdhaXQgZnVuYygpIiwic2N0IjoiRXgoKS50ZXN0X2ltcG9ydChcImFzeW5jaW9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiYXN5bmMgZGVmIG15X2Nvcm8oKTpcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgZGVmaW5lIHRoZSBhc3luYyBkZWYgZnVuY3Rpb24gYG15X2Nvcm8oKWA/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcImF3YWl0IGZ1bmMoKVwiLCBwYXR0ZXJuPUZhbHNlLCBub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBhZGQgYGF3YWl0IGZ1bmN0KClgIHRvIHRoZSBhc3luYyBkZWYgZnVuY3Rpb24gYG15X2Nvcm8oKWA/XCIpXG5zdWNjZXNzX21zZyhcIldlbGwgZG9uZSEgWW91IGhhdmUgbm93IGNyZWF0ZWQgYSBjb3JvdXRpbmUgdXNpbmcgUHl0aG9uIDMuNSFcIikifQ==

Saat Anda mendefinisikan coroutine dengan cara ini, Anda tidak dapat menggunakan yield di dalam fungsi coroutine. Sebagai gantinya, fungsi harus menyertakan pernyataan return atau await yang digunakan untuk mengembalikan nilai ke pemanggil. Perhatikan bahwa kata kunci await hanya dapat digunakan di dalam fungsi async def.

Kata kunci async/await dapat dianggap sebagai API untuk pemrograman asinkron. Modul asyncio hanyalah kerangka kerja yang kebetulan menggunakan async/await untuk pemrograman asinkron. Sebenarnya ada proyek bernama curio yang membuktikan konsep ini karena merupakan implementasi event loop terpisah yang menggunakan async/await di balik layar.

Contoh Coroutine yang Buruk

Walaupun tentu membantu memiliki banyak informasi latar tentang cara kerja semua ini, terkadang Anda hanya ingin melihat beberapa contoh agar bisa merasakan sintaksnya dan cara menyusunnya.

Dengan pemikiran itu, mari mulai dengan contoh sederhana!

Salah satu tugas yang cukup umum adalah mengunduh berkas dari suatu lokasi, baik itu sumber internal maupun berkas di Internet. Biasanya Anda ingin mengunduh lebih dari satu berkas.

Jadi mari kita buat sepasang coroutine yang bisa melakukan itu:

import asyncio
import os
import urllib.request
 
async def download_coroutine(url):
    #"A coroutine to download the specified url"
    request = urllib.request.urlopen(url)
    filename = os.path.basename(url)
 
    with open(filename, 'wb') as file_handle:
        while True:
            chunk = request.read(1024)
            if not chunk:
                break
            file_handle.write(chunk)
    msg = 'Finished downloading {filename}'.format(filename=filename)
    return msg
 
async def main(urls):
    """
    Creates a group of coroutines and waits for them to finish
    """
    coroutines = [download_coroutine(url) for url in urls]
    completed, pending = await asyncio.wait(coroutines)
    for item in completed:
        print(item.result())
 
 
if __name__ == '__main__':
    urls = ["http://www.irs.gov/pub/irs-pdf/f1040.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040a.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040ez.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040es.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040sb.pdf"]
 
    event_loop = asyncio.get_event_loop()
    try:
        event_loop.run_until_complete(main(urls))
    finally:
        event_loop.close()

Pada kode ini, kita mengimpor modul yang diperlukan lalu membuat coroutine pertama menggunakan sintaks async. Coroutine ini bernama download_coroutine dan menggunakan urllib milik Python untuk mengunduh URL apa pun yang diteruskan kepadanya. Ketika selesai, ia akan mengembalikan pesan yang menyatakan hal tersebut.

Coroutine lainnya adalah coroutine utama kita. Ia pada dasarnya menerima daftar satu atau lebih URL dan mengantrikannya. Kita menggunakan fungsi wait milik asyncio untuk menunggu coroutine-coroutine tersebut selesai. Tentu saja, untuk benar-benar memulai coroutine, mereka perlu ditambahkan ke event loop. Kita melakukannya di bagian akhir saat kita mendapatkan event loop dan memanggil metode run_until_complete-nya. Anda akan melihat bahwa kita meneruskan coroutine utama ke event loop. Ini akan menjalankan coroutine utama yang mengantri coroutine kedua dan memulainya. Ini dikenal sebagai chained coroutine.

Masalah dengan contoh ini adalah sebenarnya ini bukan coroutine sama sekali. Alasannya adalah fungsi download_coroutine tidak bersifat asinkron. Permasalahannya adalah urllib tidak asinkron dan selain itu, saya tidak menggunakan await atau yield sama sekali. Cara yang lebih baik adalah menggunakan paket aiohttp. Mari kita lihat itu selanjutnya!

Contoh Coroutine yang Lebih Baik

Paket aiohttp dirancang untuk membuat klien dan server HTTP asinkron. Anda dapat memasangnya dengan pip seperti ini:

pip install aiohttp

Setelah terpasang, mari perbarui kode kita untuk menggunakan aiohttp sehingga kita dapat mengunduh berkas-berkas tersebut:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImltcG9ydCBhaW9odHRwXG5pbXBvcnQgYXN5bmNpb1xuaW1wb3J0IGFzeW5jX3RpbWVvdXRcbmltcG9ydCBvc1xuIFxuYXN5bmMgZGVmIGRvd25sb2FkX2Nvcm91dGluZShzZXNzaW9uLCB1cmwpOlxuICAgIHdpdGggYXN5bmNfdGltZW91dC50aW1lb3V0KDEwKTpcbiAgICAgICAgYXN5bmMgd2l0aCBzZXNzaW9uLmdldCh1cmwpIGFzIHJlc3BvbnNlOlxuICAgICAgICAgICAgZmlsZW5hbWUgPSBfXy5wYXRoLmJhc2VuYW1lKHVybClcbiAgICAgICAgICAgIHdpdGggb3BlbihfX19fX19fXywgJ3diJykgYXMgZl9oYW5kbGU6XG4gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZTpcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBhd2FpdCByZXNwb25zZS5jb250ZW50LnJlYWQoMTAyNClcbiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgZl9oYW5kbGUud3JpdGUoX19fX18pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UucmVsZWFzZSgpXG4gXG5hc3luYyBkZWYgbWFpbihsb29wKTpcbiAgICB1cmxzID0gW1wiaHR0cDovL3d3dy5pcnMuZ292L3B1Yi9pcnMtcGRmL2YxMDQwLnBkZlwiLFxuICAgICAgICBcImh0dHA6Ly93d3cuaXJzLmdvdi9wdWIvaXJzLXBkZi9mMTA0MGEucGRmXCIsXG4gICAgICAgIFwiaHR0cDovL3d3dy5pcnMuZ292L3B1Yi9pcnMtcGRmL2YxMDQwZXoucGRmXCIsXG4gICAgICAgIFwiaHR0cDovL3d3dy5pcnMuZ292L3B1Yi9pcnMtcGRmL2YxMDQwZXMucGRmXCIsXG4gICAgICAgIFwiaHR0cDovL3d3dy5pcnMuZ292L3B1Yi9pcnMtcGRmL2YxMDQwc2IucGRmXCJdXG4gXG4gICAgYXN5bmMgd2l0aCBhaW9odHRwLkNsaWVudFNlc3Npb24obG9vcD1sb29wKSBhcyBzZXNzaW9uOlxuICAgICAgICB0YXNrcyA9IFtkb3dubG9hZF9jb3JvdXRpbmUoc2Vzc2lvbiwgdXJsKSBmb3IgdXJsIGluIHVybHNdXG4gICAgICAgIGF3YWl0IGFzeW5jaW8uZ2F0aGVyKCp0YXNrcylcbiBcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XG4gICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKVxuICAgIGxvb3AucnVuX3VudGlsX2NvbXBsZXRlKG1haW4obG9vcCkpIiwic29sdXRpb24iOiJpbXBvcnQgYWlvaHR0cFxuaW1wb3J0IGFzeW5jaW9cbmltcG9ydCBhc3luY190aW1lb3V0XG5pbXBvcnQgb3NcbiBcbmFzeW5jIGRlZiBkb3dubG9hZF9jb3JvdXRpbmUoc2Vzc2lvbiwgdXJsKTpcbiAgICB3aXRoIGFzeW5jX3RpbWVvdXQudGltZW91dCgxMCk6XG4gICAgICAgIGFzeW5jIHdpdGggc2Vzc2lvbi5nZXQodXJsKSBhcyByZXNwb25zZTpcbiAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh1cmwpXG4gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGZfaGFuZGxlOlxuICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6XG4gICAgICAgICAgICAgICAgICAgIGNodW5rID0gYXdhaXQgcmVzcG9uc2UuY29udGVudC5yZWFkKDEwMjQpXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVuazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGZfaGFuZGxlLndyaXRlKGNodW5rKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLnJlbGVhc2UoKVxuIFxuYXN5bmMgZGVmIG1haW4obG9vcCk6XG4gICAgdXJscyA9IFtcImh0dHA6Ly93d3cuaXJzLmdvdi9wdWIvaXJzLXBkZi9mMTA0MC5wZGZcIixcbiAgICAgICAgXCJodHRwOi8vd3d3Lmlycy5nb3YvcHViL2lycy1wZGYvZjEwNDBhLnBkZlwiLFxuICAgICAgICBcImh0dHA6Ly93d3cuaXJzLmdvdi9wdWIvaXJzLXBkZi9mMTA0MGV6LnBkZlwiLFxuICAgICAgICBcImh0dHA6Ly93d3cuaXJzLmdvdi9wdWIvaXJzLXBkZi9mMTA0MGVzLnBkZlwiLFxuICAgICAgICBcImh0dHA6Ly93d3cuaXJzLmdvdi9wdWIvaXJzLXBkZi9mMTA0MHNiLnBkZlwiXVxuIFxuICAgIGFzeW5jIHdpdGggYWlvaHR0cC5DbGllbnRTZXNzaW9uKGxvb3A9bG9vcCkgYXMgc2Vzc2lvbjpcbiAgICAgICAgdGFza3MgPSBbZG93bmxvYWRfY29yb3V0aW5lKHNlc3Npb24sIHVybCkgZm9yIHVybCBpbiB1cmxzXVxuICAgICAgICBhd2FpdCBhc3luY2lvLmdhdGhlcigqdGFza3MpXG4gXG4gXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxuICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKClcbiAgICBsb29wLnJ1bl91bnRpbF9jb21wbGV0ZShtYWluKGxvb3ApKSIsInNjdCI6IkV4KCkudGVzdF9pbXBvcnQoXCJhaW9odHRwXCIpXG5FeCgpLnRlc3RfaW1wb3J0KFwiYXN5bmNpb1wiKVxuRXgoKS50ZXN0X2ltcG9ydChcImFzeW5jX3RpbWVvdXRcIilcbkV4KCkudGVzdF9pbXBvcnQoXCJvc1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJhc3luYyBkZWYgZG93bmxvYWRfY29yb3V0aW5lKHNlc3Npb24sIHVybCk6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGRlZmluZSBgYXN5bmMgZGVmIGRvd25sb2FkX2Nvcm91dGluZWAgdGhhdCB0YWtlcyBgc2Vzc2lvbmAgYW5kIGB1cmxgIGFzIGFyZ3VtZW50cz9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwid2l0aCBhc3luY190aW1lb3V0LnRpbWVvdXQoMTApXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3Ugc2V0IHRoZSBhc3luYyB0aW1lb3V0IGF0IGAxMGAgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJhc3luYyB3aXRoIHNlc3Npb24uZ2V0KHVybCkgYXMgcmVzcG9uc2U6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGNhbGwgYHNlc3Npb25gJ3MgYGdldCgpYCBtZXRob2QgdG8gZ2V0IHRoZSBgcmVzcG9uc2VgIG9iamVjdCBiYWNrP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodXJsKVwiLHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IHNwZWNpZnkgdGhlIGBmaWxlbmFtZWAgdmFyaWFibGUgd2l0aCB0aGUgaGVscCBvZiBgb3MucGF0aC5iYXNlbmFtZSgpYD9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwid2l0aCBvcGVuKGZpbGVuYW1lLCBcXCd3YlxcJykgYXMgZl9oYW5kbGU6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IHBhc3MgYGZpbGVuYW1lYCBhbmQgYCd3YidgIHRvIGBvcGVuKClgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJ3aGlsZSBUcnVlXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiY2h1bmsgPSBhd2FpdCByZXNwb25zZS5jb250ZW50LnJlYWQoMTAyNClcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3Ugc3BlY2lmeSB0aGUgYGNodW5rYCB2YXJpYWJsZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiaWYgbm90IGNodW5rXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiYnJlYWtcIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBsZWF2ZSBzb21ldGhpbmcgb3V0IG9mIHRoZSBjb2RlP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJmX2hhbmRsZS53cml0ZShjaHVuaylcIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBwYXNzIGBjaHVua2AgdG8gYGZfaGFuZGxlLndyaXRlKClgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJyZXR1cm4gYXdhaXQgcmVzcG9uc2UucmVsZWFzZSgpXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiYXN5bmMgZGVmIG1haW4obG9vcCk6XCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwidXJscyA9IFtcXFwiaHR0cDovL3d3dy5pcnMuZ292L3B1Yi9pcnMtcGRmL2YxMDQwLnBkZlxcXCIsXCIscGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIk1ha2Ugc3VyZSB0byBwYXNzIGF0IGxlYXN0IDEgdXJsIHRvIHRoZSBgdXJsc2AgdmFyaWFibGUhXCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcIlxcXCJdXCIsIHBhdHRlcm49RmFsc2UsKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJhc3luYyB3aXRoIGFpb2h0dHAuQ2xpZW50U2Vzc2lvbihsb29wPWxvb3ApIGFzIHNlc3Npb246XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGxlYXZlIHNvbWV0aGluZyBvdXQgb2YgdGhlIGNvZGU/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcInRhc2tzID0gW2Rvd25sb2FkX2Nvcm91dGluZShzZXNzaW9uLCB1cmwpIGZvciB1cmwgaW4gdXJsc11cIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBsZWF2ZSBzb21ldGhpbmcgb3V0IG9mIHRoZSBjb2RlP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJhd2FpdCBhc3luY2lvLmdhdGhlcigqdGFza3MpXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiaWYgX19uYW1lX18gPT0gXFwnX19tYWluX19cXCc6XCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgbGVhdmUgc29tZXRoaW5nIG91dCBvZiB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwibG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKVwiLCBwYXR0ZXJuPUZhbHNlLG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGluaXRpYWxpemUgYSBgbG9vcGAgb2JqZWN0P1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJsb29wLnJ1bl91bnRpbF9jb21wbGV0ZShtYWluKGxvb3ApKVwiLCBwYXR0ZXJuPUZhbHNlLG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGxlYXZlIHNvbWV0aGluZyBvdXQgb2YgdGhlIGNvZGU/XCIpXG5zdWNjZXNzX21zZyhcIldlbGwgZG9uZSEgWW91IGhhdmUgbm93IGRvd25sb2FkZWQgdGhlIGZpbGVzIHdpdGggdGhlIGBhaW9odHRwYCBwYWNrYWdlIVwiKSJ9

Anda akan melihat di sini bahwa kita mengimpor dua hal baru: aiohttp dan async_timeout. Yang terakhir sebenarnya adalah salah satu dependensi aiohttp dan memungkinkan kita membuat context manager timeout. Mari mulai dari bagian bawah kode dan bergerak ke atas. Pada pernyataan kondisional paling bawah, kita memulai event loop asinkron dan memanggil fungsi main kita.

Di fungsi main, kita membuat objek ClientSession yang kita teruskan ke fungsi coroutine pengunduhan untuk setiap url yang ingin kita unduh. Di download_coroutine, kita membuat context manager async_timeout.timeout() yang pada dasarnya membuat penghitung waktu dalam detik. Ketika waktunya habis, context manager berakhir atau timeout. Dalam kasus ini, timeout-nya 10 detik. Berikutnya kita memanggil metode get() milik session yang memberi kita objek response. Sekarang kita sampai pada bagian yang agak “ajaib”. Saat Anda menggunakan atribut content dari objek response, ia mengembalikan instance aiohttp.StreamReader yang memungkinkan kita mengunduh berkas secara bertahap (chunk) dengan ukuran yang kita inginkan. Saat kita membaca berkas, kita menuliskannya ke disk lokal. Terakhir, kita memanggil metode release() milik response, yang akan menyelesaikan pemrosesan response.

Menurut dokumentasi aiohttp, karena objek response dibuat di dalam context manager, secara teknis ia memanggil release() secara implisit. Namun dalam Python, eksplisit biasanya lebih baik dan ada catatan di dokumentasi bahwa kita tidak boleh bergantung pada koneksi yang “otomatis hilang”, jadi saya rasa lebih baik tetap memanggil release dalam kasus ini.

Masih ada satu bagian yang memblokir di sini, yaitu bagian kode yang benar-benar menulis ke disk. Saat kita menulis berkas, kita tetap memblokir. Ada pustaka lain bernama aiofiles yang bisa kita gunakan untuk mencoba membuat proses penulisan berkas menjadi asinkron juga, namun pembaruan itu saya serahkan kepada pembaca.

Menjadwalkan Pemanggilan

Anda juga dapat menjadwalkan pemanggilan ke fungsi reguler menggunakan event loop asyncio. Metode pertama yang akan kita lihat adalah call_soon. Metode call_soon pada dasarnya akan memanggil callback atau event handler Anda secepat yang bisa dilakukan. Ini bekerja sebagai antrean FIFO, jadi jika beberapa callback membutuhkan waktu lama untuk berjalan, maka yang lain akan tertunda sampai yang sebelumnya selesai.

Mari lihat contohnya:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImltcG9ydCBfX19fX19cbmltcG9ydCBmdW5jdG9vbHNcbiBcbmRlZiBldmVudF9oYW5kbGVyKGxvb3AsIHN0b3A9RmFsc2UpOlxuICAgIHByaW50KCdFdmVudCBoYW5kbGVyIGNhbGxlZCcpXG4gICAgaWYgc3RvcDpcbiAgICAgICAgcHJpbnQoJ3N0b3BwaW5nIHRoZSBsb29wJylcbiAgICAgICAgbG9vcC5zdG9wKClcblxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcbiAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpXG4gICAgdHJ5OlxuICAgICAgICBsb29wLmNhbGxfc29vbihmdW5jdG9vbHMucGFydGlhbChfX19fX19fX19fX19fLCBfX19fKSlcbiAgICAgICAgcHJpbnQoJ3N0YXJ0aW5nIGV2ZW50IGxvb3AnKVxuICAgICAgICBsb29wLmNhbGxfc29vbihmdW5jdG9vbHMucGFydGlhbChfX19fX19fX19fX19fLCBfX19fLCBzdG9wPVRydWUpKVxuIFxuICAgICAgICBsb29wLl9fX19fX19fX18oKVxuICAgIGZpbmFsbHk6XG4gICAgICAgIHByaW50KCdjbG9zaW5nIGV2ZW50IGxvb3AnKVxuICAgICAgICBsb29wLl9fX19fKCkiLCJzb2x1dGlvbiI6ImltcG9ydCBhc3luY2lvXG5pbXBvcnQgZnVuY3Rvb2xzXG4gXG5kZWYgZXZlbnRfaGFuZGxlcihsb29wLCBzdG9wPUZhbHNlKTpcbiAgICBwcmludCgnRXZlbnQgaGFuZGxlciBjYWxsZWQnKVxuICAgIGlmIHN0b3A6XG4gICAgICAgIHByaW50KCdzdG9wcGluZyB0aGUgbG9vcCcpXG4gICAgICAgIGxvb3Auc3RvcCgpXG5cbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XG4gICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKVxuICAgIHRyeTpcbiAgICAgICAgbG9vcC5jYWxsX3Nvb24oZnVuY3Rvb2xzLnBhcnRpYWwoZXZlbnRfaGFuZGxlciwgbG9vcCkpXG4gICAgICAgIHByaW50KCdzdGFydGluZyBldmVudCBsb29wJylcbiAgICAgICAgbG9vcC5jYWxsX3Nvb24oZnVuY3Rvb2xzLnBhcnRpYWwoZXZlbnRfaGFuZGxlciwgbG9vcCwgc3RvcD1UcnVlKSlcbiBcbiAgICAgICAgbG9vcC5ydW5fZm9yZXZlcigpXG4gICAgZmluYWxseTpcbiAgICAgICAgcHJpbnQoJ2Nsb3NpbmcgZXZlbnQgbG9vcCcpXG4gICAgICAgIGxvb3AuY2xvc2UoKSIsInNjdCI6IkV4KCkudGVzdF9pbXBvcnQoXCJhc3luY2lvXCIpXG5FeCgpLnRlc3RfaW1wb3J0KFwiZnVuY3Rvb2xzXCIpXG5FeCgpLnRlc3RfZnVuY3Rpb25fZGVmaW5pdGlvbihcImV2ZW50X2hhbmRsZXJcIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiaWYgX19uYW1lX18gPT0gXFwnX19tYWluX19cXCc6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IHJlbW92ZSBzb21ldGhpbmcgZnJvbSB0aGUgY29kZTE/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcImxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKClcIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBhc3NpZ24gYGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKWAgdG8gYGxvb3BgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJ0cnk6XCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgYWRkIGB0cnlgIHRvIHRoZSBjb2RlP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJsb29wLmNhbGxfc29vbihmdW5jdG9vbHMucGFydGlhbChldmVudF9oYW5kbGVyLCBsb29wKSlcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgcGFzcyBgZXZlbnRfaGFuZGxlcmAgYW5kIGBsb29wYCB0byBgbG9vcC5jYWxsX3Nvb24oZnVuY3Rvb2xzLnBhcnRpYWwoKSlgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJsb29wLmNhbGxfc29vbihmdW5jdG9vbHMucGFydGlhbChldmVudF9oYW5kbGVyLCBsb29wLCBzdG9wPVRydWUpKVwiLCBwYXR0ZXJuPUZhbHNlLCBub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBwYXNzIGBldmVudF9oYW5kbGVyYCBhbmQgYGxvb3BgIHRvIGBsb29wLmNhbGxfc29vbihmdW5jdG9vbHMucGFydGlhbCgpKWA/IERvbid0IGZvcmdldCB0byBrZWVwIGBzdG9wYCBzZXQgdG8gYFRydWVgIVwiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJsb29wLnJ1bl9mb3JldmVyKClcIiwgcGF0dGVybj1GYWxzZSxub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBhZGQgYGxvb3AucnVuX2ZvcmV2ZXIoKWAgdG8gdGhlIGNvZGU/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcImZpbmFsbHk6XCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgYWRkIGBmaW5hbGx5YCB0byB0aGUgY29kZT9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwibG9vcC5jbG9zZSgpXCIsIHBhdHRlcm49RmFsc2Usbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgY2xvc2UgYGxvb3BgP1wiKVxuc3VjY2Vzc19tc2coXCJZb3UgaGF2ZSBub3cgc3VjY2Vzc2Z1bGx5IGxlYXJuZWQgaG93IHRvIHNjaGVkdWxlIGNhbGxzIHdpdGggdGhlIGFzeW5jaW8gZXZlbnQgbG9vcCFcIikifQ==

Mayoritas fungsi asyncio tidak menerima argumen keyword, sehingga kita membutuhkan modul functools jika perlu meneruskan keyword ke event handler kita. Fungsi reguler kita akan mencetak teks ke stdout setiap kali dipanggil. Jika Anda mengatur argumen stop-nya ke True, fungsi ini juga akan menghentikan event loop.

Pemanggilan pertama tidak menghentikan loop. Pemanggilan kedua menghentikan loop. Alasannya karena kita telah memerintahkan loop untuk run_forever, yang akan menempatkan event loop dalam loop tak terbatas. Setelah loop dihentikan, kita dapat menutupnya.

Jika Anda menjalankan kode ini, Anda akan melihat keluaran berikut:

starting event loop
Event handler called
Event handler called
stopping the loop
closing event loop

Ada fungsi terkait bernama call_soon_threadsafe. Sesuai namanya, ia bekerja sama seperti call_soon, tetapi thread-safe. Jika Anda ingin benar-benar menunda pemanggilan hingga waktu tertentu di masa depan, Anda dapat menggunakan fungsi call_later. Dalam kasus ini, kita bisa mengubah pemanggilan call_soon menjadi sebagai berikut:

loop.call_later(1, event_handler, loop)

Ini akan menunda pemanggilan event handler selama satu detik, kemudian memanggilnya dan meneruskan loop sebagai parameter pertamanya. Jika Anda ingin menjadwalkan waktu spesifik di masa mendatang, maka Anda perlu mengambil waktu milik loop, bukan waktu komputer. Anda bisa melakukannya seperti ini:

current_time = loop.time()

Setelah itu, Anda bisa menggunakan fungsi call_at dan meneruskan waktu kapan Anda ingin memanggil event handler. Misalnya kita ingin memanggil event handler lima menit dari sekarang. Berikut cara melakukannya:

loop.call_at(current_time + 300, event_handler, loop)

Pada contoh ini, kita menggunakan waktu saat ini yang telah diambil dan menambahkan 300 detik atau lima menit. Dengan begitu, kita menunda pemanggilan event handler selama lima menit! Cukup keren!

Tugas (Tasks)

Task adalah subkelas dari Future dan pembungkus untuk coroutine. Task memberi Anda kemampuan untuk melacak kapan pemrosesan selesai. Karena merupakan tipe Future, coroutine lain dapat menunggu sebuah task dan Anda juga dapat mengambil hasil task saat pemrosesannya selesai.

Mari kita lihat contoh sederhana:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImltcG9ydCBfX19fX19fXG5cbmFzeW5jIGRlZiBteV90YXNrKHNlY29uZHMpOlxuICAgIFwiXCJcIlxuICAgIEEgdGFzayB0byBkbyBmb3IgYSBudW1iZXIgb2Ygc2Vjb25kc1xuICAgIFwiXCJcIlxuICAgIHByaW50KCdUaGlzIHRhc2sgaXMgdGFraW5nIHt9IHNlY29uZHMgdG8gY29tcGxldGUnLmZvcm1hdChcbiAgICAgICAgc2Vjb25kcykpXG4gICAgYXdhaXQgYXN5bmNpby5zbGVlcChfX19fX19fKVxuICAgIHJldHVybiAndGFzayBmaW5pc2hlZCdcbiBcbiBcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XG4gICAgbXlfZXZlbnRfbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKVxuICAgIHRyeTpcbiAgICAgICAgcHJpbnQoJ3Rhc2sgY3JlYXRpb24gc3RhcnRlZCcpXG4gICAgICAgIHRhc2tfb2JqID0gbXlfZXZlbnRfbG9vcC5jcmVhdGVfdGFzayhteV90YXNrKHNlY29uZHM9MikpXG4gICAgICAgIG15X2V2ZW50X2xvb3AucnVuX3VudGlsX2NvbXBsZXRlKHRhc2tfb2JqKVxuICAgIGZpbmFsbHk6XG4gICAgICAgIG15X2V2ZW50X2xvb3AuX19fX18oKVxuIFxuICAgIHByaW50KFwiVGhlIHRhc2sncyByZXN1bHQgd2FzOiB7fVwiLmZvcm1hdCh0YXNrX29iai5yZXN1bHQoKSkpIiwic29sdXRpb24iOiJpbXBvcnQgYXN5bmNpb1xuXG5hc3luYyBkZWYgbXlfdGFzayhzZWNvbmRzKTpcbiAgICBcIlwiXCJcbiAgICBBIHRhc2sgdG8gZG8gZm9yIGEgbnVtYmVyIG9mIHNlY29uZHNcbiAgICBcIlwiXCJcbiAgICBwcmludCgnVGhpcyB0YXNrIGlzIHRha2luZyB7fSBzZWNvbmRzIHRvIGNvbXBsZXRlJy5mb3JtYXQoc2Vjb25kcykpXG4gICAgYXdhaXQgYXN5bmNpby5zbGVlcChzZWNvbmRzKVxuICAgIHJldHVybiAndGFzayBmaW5pc2hlZCdcbiBcbiBcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XG4gICAgbXlfZXZlbnRfbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKVxuICAgIHRyeTpcbiAgICAgICAgcHJpbnQoJ3Rhc2sgY3JlYXRpb24gc3RhcnRlZCcpXG4gICAgICAgIHRhc2tfb2JqID0gbXlfZXZlbnRfbG9vcC5jcmVhdGVfdGFzayhteV90YXNrKHNlY29uZHM9MikpXG4gICAgICAgIG15X2V2ZW50X2xvb3AucnVuX3VudGlsX2NvbXBsZXRlKHRhc2tfb2JqKVxuICAgIGZpbmFsbHk6XG4gICAgICAgIG15X2V2ZW50X2xvb3AuY2xvc2UoKVxuIFxuICAgIHByaW50KFwiVGhlIHRhc2sncyByZXN1bHQgd2FzOiB7fVwiLmZvcm1hdCh0YXNrX29iai5yZXN1bHQoKSkpIiwic2N0IjoiRXgoKS50ZXN0X2ltcG9ydChcImFzeW5jaW9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwiYXN5bmMgZGVmIG15X3Rhc2soc2Vjb25kcyk6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGRlZmluZSB0aGUgYXN5bmMgZnVuY3Rpb24gYG15X3Rhc2soKWA/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcImF3YWl0IGFzeW5jaW8uc2xlZXAoc2Vjb25kcylcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgcGFzcyBgc2Vjb25kc2AgdG8gYGFzeW5jaW8uc2xlZXAoKWA/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcInJldHVybiBcXCd0YXNrIGZpbmlzaGVkXFwnXCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IHJldHVybiBcXCd0YXNrIGZpbmlzaGVkXFwnP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJpZiBfX25hbWVfXyA9PSBcXCdfX21haW5fX1xcJzpcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgcmVtb3ZlIHNvbWV0aGluZyBmcm9tIHRoZSBjb2RlP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJteV9ldmVudF9sb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpXCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGdldCB0aGUgZXZlbnQgbG9vcCB3aXRoIGBnZXRfZXZlbnRfbG9vcCgpYCBhbmQgYXNzaWduIGl0IHRvIGBteV9ldmVudF9sb29wYD9cIilcbkV4KCkudGVzdF9zdHVkZW50X3R5cGVkKFwidHJ5OlwiLCBwYXR0ZXJuPUZhbHNlLCBub3RfdHlwZWRfbXNnPVwiRGlkIHlvdSBhZGQgYHRyeWAgdG8gdGhlIGNvZGUgY2h1bms/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcInRhc2tfb2JqID0gbXlfZXZlbnRfbG9vcC5jcmVhdGVfdGFzayhteV90YXNrKHNlY29uZHM9MikpXCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IGNyZWF0ZSBhIHRhc2sgZm9yIGBteV9ldmVudF9sb29wYCB3aXRoIGBjcmVhdGVfdGFza2A/IEFsc28gZG9uJ3QgZm9yZ2V0IHRvIHBhc3MgYG15X3Rhc2soc2Vjb25kcz0yKWAgdG8gdGhlIGZ1bmN0aW9uIVwiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJteV9ldmVudF9sb29wLnJ1bl91bnRpbF9jb21wbGV0ZSh0YXNrX29iailcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgYWRkIGBteV9ldmVudF9sb29wLnJ1bl91bnRpbF9jb21wbGV0ZSh0YXNrX29iaikgdG8gdGhlIGNvZGUgY2h1bms/XCIpXG5FeCgpLnRlc3Rfc3R1ZGVudF90eXBlZChcImZpbmFsbHk6XCIsIHBhdHRlcm49RmFsc2UsIG5vdF90eXBlZF9tc2c9XCJEaWQgeW91IHNwZWNpZnkgYGZpbmFsbHlgP1wiKVxuRXgoKS50ZXN0X3N0dWRlbnRfdHlwZWQoXCJteV9ldmVudF9sb29wLmNsb3NlKClcIiwgcGF0dGVybj1GYWxzZSwgbm90X3R5cGVkX21zZz1cIkRpZCB5b3UgY2xvc2UgYG15X2V2ZW50X2xvb3BgIHdpdGggYGNsb3NlKClgP1wiKVxuc3VjY2Vzc19tc2coXCJDb25ncmF0cyEgWW91IGhhdmUgY3JlYXRlZCBhbiBhc3luYyBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGl0IHdpbGwgdGFrZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIHJ1biFcIikifQ==

Di sini kita membuat fungsi asinkron yang menerima jumlah detik yang dibutuhkan fungsi untuk berjalan. Ini mensimulasikan proses yang berjalan lama. Lalu kita membuat event loop dan membuat objek task dengan memanggil fungsi create_task milik objek event loop. Fungsi create_task menerima fungsi yang ingin kita ubah menjadi task. Kemudian kita memberi tahu event loop untuk berjalan hingga task selesai. Pada bagian akhir, kita mengambil hasil task karena sudah selesai.

Task juga dapat dibatalkan dengan sangat mudah menggunakan metode cancel. Cukup panggil saat Anda ingin mengakhiri task. Jika sebuah task dibatalkan ketika menunggu operasi lain, task tersebut akan memunculkan CancelledError.

Penutup

Pada titik ini, Anda seharusnya sudah cukup paham untuk mulai bekerja dengan pustaka asyncio secara mandiri. Pustaka asyncio sangat kuat dan memungkinkan Anda melakukan banyak tugas yang menarik. Pustaka asyncio dirancang untuk soket jaringan.

Pustaka hebat yang memungkinkan pemrograman soket asinkron sebelum asyncio adalah kerangka kerja Twisted. Proyek menarik lainnya adalah Dask, yang merupakan pustaka komputasi paralel yang fleksibel untuk komputasi analitik. Telusuri dokumentasi modul asyncio dan biarkan ide-ide Anda mengalir!

Topik
Python

Kursus Python

{count, plural, one {Kursus} other {Kursus}}

Pengantar Python

{hours} jam
7.1M
Kuasai dasar-dasar analisis data dengan Python dalam 4 jam. Kursus online ini memperkenalkan antarmuka Python dan pustaka populer.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

{count, plural, one {blog} other {blogs}}

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

{count, plural, one {blog} other {blogs}}

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

{count, plural, one {blog} other {blogs}}

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

{count, plural, one {blog} other {blogs}}

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

Lihat SelengkapnyaLihat Selengkapnya