Pemrograman Asinkron dengan Python

Mar 06 2023
Pemrograman asinkron adalah paradigma pemrograman yang memungkinkan banyak proses bekerja secara bersamaan dan mandiri, tanpa menunggu satu proses selesai sebelum melanjutkan ke proses berikutnya. Dalam posting blog ini kita akan melihat apa itu pemrograman asinkron dan bagaimana menggunakannya dengan python.
Pemrograman Asinkron dengan Python

Pemrograman asinkron adalah paradigma pemrograman yang memungkinkan banyak proses bekerja secara bersamaan dan mandiri, tanpa menunggu satu proses selesai sebelum melanjutkan ke proses berikutnya. Dalam posting blog ini kita akan melihat apa itu pemrograman asinkron dan bagaimana menggunakannya dengan python.

Apa itu Pemrograman Asinkron?

Dalam pemrograman sinkron, komputer mengeksekusi instruksi secara berurutan, memblokir eksekusi hingga suatu pekerjaan selesai sebelum melanjutkan ke pekerjaan berikutnya.
Pemrograman asinkron, di sisi lain, memungkinkan program untuk memulai satu operasi dan kemudian melanjutkan ke operasi lain tanpa menghentikan eksekusi hingga tugas awal selesai.

Pemrograman asinkron sangat bermanfaat dalam keadaan di mana proses, seperti jaringan I/O atau operasi basis data, dapat memakan waktu lama untuk diselesaikan. Pemrograman asinkron dapat membantu meningkatkan kinerja dan daya tanggap dalam aplikasi perangkat lunak dengan membiarkan program melanjutkan ke aktivitas lain sambil menunggu operasi yang lambat selesai.

Bergantung pada bahasa pemrograman dan kerangka kerja yang digunakan, pemrograman asinkron dapat dilakukan dengan menggunakan berbagai strategi seperti panggilan balik, janji, atau kata kunci async/menunggu.

Perbedaan Antara Pemrograman Asinkron dan Mutliprocessing

Perbedaan utama antara pemrograman asinkron dan multiprosesing adalah bahwa pemrograman asinkron memungkinkan operasi non-pemblokiran terjadi dalam satu utas, sedangkan multiprosesing menggunakan banyak inti atau proses untuk menyelesaikan pekerjaan secara bersamaan.

Perbedaan Antara Pemrograman Asinkron dan Threading

Perbedaan utama antara pemrograman asinkron dan threading adalah bahwa pemrograman asinkron memungkinkan operasi tanpa pemblokiran dengan menggunakan satu utas, sedangkan threading menggunakan banyak utas untuk melakukan banyak tugas secara paralel.

Untuk informasi lebih lanjut tentang perbedaan: Treading vs Multiprocessing vs Asynchronous Programming

Bagaimana cara menggunakan Asyncio?

Pertama mari kita buat program sederhana yang mulai melakukan pekerjaan pada satu waktu dan menyelesaikannya.

import time
import asyncio

def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

main()

# OUTPUT
# Job A started
# Job Adone
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

Membuat dan Menjalankan Coroutine

Coroutine adalah jenis fungsi yang dapat diinterupsi dan dilanjutkan pada berbagai waktu selama eksekusi. Dengan kata lain, coroutine memungkinkan Anda untuk menulis kode yang dapat diinterupsi, melakukan hal lain, lalu melanjutkan dari bagian terakhir.

Untuk membuat coroutine, kita perlu menggunakan asynckata kunci sebelum defkata kunci. Memanggil coroutine tidak memanggil fungsi yang ingin kita jalankan. Itu menciptakan tugas.

import time
import asyncio

async def do_job(s):
  ...

async def main():
  ...

main()

asyncio.run(main())

jika Anda menjalankan kode ini, Anda mungkin mendapatkan kesalahan seperti ini:

RuntimeWarning: coroutine '...' was never awaited

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        await do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job A done
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

await asyncio.sleep(1)

tasks = [asyncio.create_task(do_job(item)) for item in todo]
done, pending = await asyncio.wait(tasks)

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    
    tasks = [asyncio.create_task(do_job(item)) for item in todo]
    done, pending = await asyncio.wait(tasks)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job B started
# Job C started
# Job A done
# Job B done
# Job C done
# Took: 1.009 seconds

Anda dapat melihat video untuk mendapatkan informasi lebih lanjut tentang pemrograman asinkron dengan python. ( Pengantar async Python | Menulis Perayap Web )