0Pricing
Python Academy · Pelajaran

await, Task, dan Pengumpulan

Gunakan await, asyncio.create_task, dan asyncio.gather untuk konkurensi.

await, Task, dan Pengumpulan adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

await vs Berurutan

Menggunakan await saja akan menjalankan korutin secara berurutan. Untuk menjalankannya secara bersamaan, bungkus korutin tersebut dalam tugas.

import asyncio

async def main():
    # Sequential — total ~3 s
    await asyncio.sleep(2)
    await asyncio.sleep(1)

    # Concurrent using gather — total ~2 s
    await asyncio.gather(asyncio.sleep(2), asyncio.sleep(1))

asyncio.create_task()

asyncio.create_task(coro) menjadwalkan korutin untuk berjalan sebagai tugas independen secara bersamaan dengan korutin saat ini.

import asyncio

async def work(n):
    await asyncio.sleep(n)
    return n

async def main():
    t1 = asyncio.create_task(work(2))
    t2 = asyncio.create_task(work(1))
    r1 = await t1
    r2 = await t2
    print(r1, r2)   # 2 1 (total ~2 s)

asyncio.run(main())

asyncio.gather()

asyncio.gather(*coros) menjalankan korutin secara bersamaan dan mengembalikan semua hasil sesuai urutan setelah semuanya selesai.

import asyncio

async def fetch(i):
    await asyncio.sleep(1)
    return f"data-{i}"

async def main():
    results = await asyncio.gather(fetch(1), fetch(2), fetch(3))
    print(results)  # ["data-1", "data-2", "data-3"] in ~1 s

asyncio.run(main())

gather dengan return_exceptions

Atur return_exceptions=True agar korutin yang gagal mengembalikan pengecualiannya sebagai hasil, bukan membatalkan seluruh operasi gather.

import asyncio

async def risky(n):
    if n == 2: raise ValueError("bad")
    return n

async def main():
    results = await asyncio.gather(
        risky(1), risky(2), risky(3),
        return_exceptions=True
    )
    print(results)   # [1, ValueError("bad"), 3]

asyncio.wait()

asyncio.wait(tasks, return_when=...) mengembalikan dua himpunan: done dan pending. Gunakan FIRST_COMPLETED untuk merespons hasil pertama.

import asyncio

async def slow(): await asyncio.sleep(3); return "slow"
async def fast(): await asyncio.sleep(1); return "fast"

async def main():
    tasks = {asyncio.create_task(slow()), asyncio.create_task(fast())}
    done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    for t in pending: t.cancel()

Pembatalan Tugas

Panggil task.cancel() untuk meminta pembatalan. Tugas menerima asyncio.CancelledError pada titik await berikutnya.

import asyncio

async def long_job():
    try:
        await asyncio.sleep(100)
    except asyncio.CancelledError:
        print("Cancelled!")
        raise   # re-raise is required

async def main():
    t = asyncio.create_task(long_job())
    await asyncio.sleep(1)
    t.cancel()
    await t

asyncio.timeout() — Python 3.11+

Bungkus operasi await dengan asyncio.timeout(seconds) untuk membatalkan operasi jika berlangsung terlalu lama.

import asyncio

async def main():
    try:
        async with asyncio.timeout(2):
            await asyncio.sleep(10)   # too slow
    except TimeoutError:
        print("Timed out!")

asyncio.wait_for()

Pada Python < 3.11, gunakan asyncio.wait_for(coro, timeout=N) untuk menambahkan batas waktu, yang akan memunculkan asyncio.TimeoutError.

import asyncio

async def slow(): await asyncio.sleep(5)

async def main():
    try:
        await asyncio.wait_for(slow(), timeout=2)
    except asyncio.TimeoutError:
        print("Timed out")

Nama dan Pemeriksaan Tugas

Beri nama tugas agar proses penelusuran kesalahan lebih mudah dengan asyncio.create_task(coro, name="..."), lalu periksa namanya dengan task.get_name().

import asyncio

async def worker(): await asyncio.sleep(1)

async def main():
    t = asyncio.create_task(worker(), name="worker-1")
    print(t.get_name())   # worker-1
    await t

TaskGroup — Python 3.11+

asyncio.TaskGroup membuat kelompok tugas terstruktur. Jika tugas mana pun memunculkan pengecualian, semua tugas akan dibatalkan.

import asyncio

async def main():
    async with asyncio.TaskGroup() as tg:
        t1 = tg.create_task(asyncio.sleep(1))
        t2 = tg.create_task(asyncio.sleep(2))
    # all tasks done here

Semafor untuk Pembatasan Laju

Gunakan asyncio.Semaphore(n) untuk membatasi jumlah operasi bersamaan, misalnya panggilan API.

import asyncio

sem = asyncio.Semaphore(5)  # max 5 concurrent

async def limited_fetch(url):
    async with sem:
        await fetch(url)   # at most 5 at a time

Pemeriksaan Singkat

Apa perbedaan antara await coro() dan asyncio.create_task(coro())?

Ringkasan

Gunakan create_task atau gather untuk eksekusi bersamaan. gather mengumpulkan semua hasil; wait memberikan kontrol yang lebih terperinci. Batalkan tugas dengan .cancel() dan terapkan batas waktu dengan wait_for atau asyncio.timeout.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “await, Task, dan Pengumpulan” gratis?

Ya — teks lengkap “await, Task, dan Pengumpulan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “await, Task, dan Pengumpulan”?

Gunakan await, asyncio.create_task, dan asyncio.gather untuk konkurensi. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “await, Task, dan Pengumpulan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Coroutine dan Event Loop
  2. await, Task, dan Pengumpulan
  3. Pengelola Konteks dan Iterator Asinkron
  4. Pola I/O Asinkron dalam Produksi
← Kembali ke Python Academy